socket简单例子

来源:互联网 发布:清空文件夹内容 linux 编辑:程序博客网 时间:2024/06/05 02:19

===server

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/sendfile.h>#include <sys/socket.h>#include <sys/types.h>#include <arpa/inet.h>#include <sys/ioctl.h>#include <unistd.h>#include <fcntl.h>static int AcceptSocket(char *psIp, int nPort){    if(psIp == NULL || nPort <= 0)        return -1;    long nIp = inet_addr(psIp);    int nReuseSoAddr = 1;    uint32_t nInterfaceIp = nIp;    uint16_t nInterfacePort = nPort;    struct in_addr tInterfaceInAddr;    struct sockaddr_in tServerAddrIn;    tInterfaceInAddr.s_addr = nInterfaceIp;    int sockTcp = socket(AF_INET, SOCK_STREAM, 0);    if (sockTcp < 0 )    {        printf("scoket error\n");        return -1;    }    if ( setsockopt(sockTcp, SOL_SOCKET, SO_REUSEADDR, &nReuseSoAddr, sizeof(nReuseSoAddr)) != 0 )    {        printf("Setsockopt error for service @ %s:%d", inet_ntoa(tInterfaceInAddr), nInterfacePort);        return -1;    }    memset(&tServerAddrIn, 0x0, sizeof(tServerAddrIn));    tServerAddrIn.sin_family = AF_INET;    tServerAddrIn.sin_addr.s_addr = nInterfaceIp;    tServerAddrIn.sin_port = htons(nInterfacePort);    if (bind(sockTcp, (struct sockaddr *)(&tServerAddrIn), sizeof(tServerAddrIn)) < 0 )    {        printf("Bind tcp error for service @ %s:%d", inet_ntoa(tInterfaceInAddr), nInterfacePort);        return -1;    }    if ( listen(sockTcp, 10) < 0 )    {        printf("Cannot listen on service @ %s:%d", inet_ntoa(tInterfaceInAddr), nInterfacePort);        return -1;    }    struct sockaddr_in tClientAddr;    socklen_t nSockAddrInLen = sizeof(struct sockaddr_in);    int sockClient = accept(sockTcp, (struct sockaddr *) (&tClientAddr), &nSockAddrInLen);    if ( -1 == sockClient )    {        printf("accept fail @ %s:%d", inet_ntoa(tInterfaceInAddr), nInterfacePort);        return -1;    }    return sockClient;}int main(void){char *psIp = "127.0.0.1";int nPort = 11125;printf("server listen %s:%d\n", psIp, nPort);int sockSMTPClient = AcceptSocket(psIp, nPort);if(sockSMTPClient <= 0){printf("%s\n", "AcceptSocket fail");return -1;}int fd = open("/tmp/test.txt", 0);if(fd <= 0){printf("%s\r\n", "file open fail");return -1;}off_t off = 0;int res = sendfile(sockSMTPClient, fd, &off, 1000);printf("res=%d\r\n", res);return EXIT_SUCCESS;}


===client

#include <stdio.h>#include <stddef.h>#include <stdlib.h>#include <string.h>#include <openssl/ssl.h>#include <openssl/err.h>#include <sys/socket.h>#include <sys/types.h>#include <arpa/inet.h>#include <sys/ioctl.h>#include <unistd.h>#define niTimeOutInterval 5#define BUFFER_SIZE 1024static int SocketConnent(char *psIp, int nPort){if(psIp == NULL || nPort <= 0)return -1;long nIp = inet_addr(psIp);struct timeval tTimeOut;tTimeOut.tv_sec = 5;tTimeOut.tv_usec = 0;struct linger lin;lin.l_onoff=1;lin.l_linger=0;struct sockaddr_in inaddr;inaddr.sin_family = AF_INET;inaddr.sin_addr.s_addr = nIp;inaddr.sin_port = htons(nPort);int niSockFd = socket(AF_INET, SOCK_STREAM, 0);if(niSockFd == -1)return -1;setsockopt(niSockFd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger));int ulFlagBlock = 1;ioctl(niSockFd, FIONBIO, &ulFlagBlock);int rv = connect(niSockFd,(struct sockaddr *)&inaddr,sizeof(struct sockaddr_in));if(-1 == rv && errno == EINPROGRESS){fd_set fdSet;FD_ZERO(&fdSet);FD_SET(niSockFd, &fdSet);if( select(niSockFd + 1, NULL, &fdSet, NULL, &tTimeOut) > 0){int niError = 0;int niLenth = sizeof(int);getsockopt(niSockFd, SOL_SOCKET, SO_ERROR, &niError, (socklen_t *)&niLenth);if(niError != 0){close(niSockFd);return -1;}}}else if(rv != 0 ){close(niSockFd);return -1;}//rv == 0 connect suculFlagBlock=0;ioctl(niSockFd, FIONBIO, &ulFlagBlock);setsockopt(niSockFd,SOL_SOCKET,SO_SNDTIMEO,&tTimeOut,(socklen_t)sizeof(struct timeval));setsockopt(niSockFd,SOL_SOCKET,SO_RCVTIMEO,&tTimeOut,(socklen_t)sizeof(struct timeval));return niSockFd;}static int SocketRead(int nSocketFD, char *psBuffer, int nBufferLen){    int ret_read;    while((ret_read = read(nSocketFD, psBuffer, nBufferLen - 1)) < 0 && errno == EINTR)        ;    if(-1 == ret_read)    {        return -1;    }    return ret_read;}int main(void){char *psIp = "127.0.0.1";int nPort = 11125;int sockSMTPClient = SocketConnent(psIp, nPort);    if(sockSMTPClient <= 0)    {        printf("Error: %s %s:%d\n", "scoket connent fail", psIp, nPort);        return 0;    }    printf("connect to %s:%d\n", psIp, nPort);    char sBuffer[BUFFER_SIZE] = { 0 };    memset(sBuffer, 0, BUFFER_SIZE);int n = SocketRead(sockSMTPClient, sBuffer, BUFFER_SIZE);printf("client read %d bytes [%s]\n", n, sBuffer);return EXIT_SUCCESS;}


原创粉丝点击