tcp socket通信例子

tcpclient:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

#define HOST_PORT               10000
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 2, 2 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return;
    }

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */

    if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup( );
        return;
    }
    int clientfd = socket(AF_INET, SOCK_STREAM, 0);
    if(clientfd < 0)
    {
        printf("client create socket failed.\n");
        return 0;
    }
    int on = 1;
    if(setsockopt(clientfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)) < 0)
    {
        printf("set socket option failed.\n");
        return 0;
    }
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(HOST_PORT);
    servaddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.56");

    char buf[BUFSIZ];
    memset(buf,0,BUFSIZ);
    strncpy(buf,"shawn's client",14);
    //buf[BUFSIZ] = '\0';

    if(connect(clientfd,(const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("%d\n",errno);
        return 0;
    }
    int index = 0;
    for(index = 0; index < 5; index++)
    {
        send(clientfd,buf,strlen(buf) + 1, 0);
        _sleep(10);
    }
    strcpy(buf,"end");
    send(clientfd,buf,strlen(buf) + 1, 0);
    closesocket(clientfd);

    getchar();
    return 0;
}
tcpserver:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define MAX_LISTEN_QUEUE_NUMBER                 10
#define HOST_PORT                               10000
#define MAX_PACKET_LENGTH                       1400
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 2, 2 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return 0;
    }

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */

    if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup( );
        return 0;
    }

    int servfd, clientfd;
    servfd = socket(AF_INET, SOCK_STREAM, 0);
    if(servfd < 0)
    {
        printf("server create socket failed.\n");
        return 0;
    }
    int on = 1;
    if(setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)) < 0)
    {
        printf("set socket option failed.\n");
        return 0;
    }
    struct sockaddr_in servaddr;
    struct sockaddr_in clientaddr;

    memset(&servaddr,0,sizeof(servaddr));
    memset(&clientaddr,0,sizeof(clientaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(HOST_PORT);
    servaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    if(bind(servfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("bind failed.\n");
        return 0;
    }
    if(listen(servfd,10) < 0)
    {
        printf("listen failed.\n");
        return 0;
    }
    char buf[MAX_PACKET_LENGTH];
    memset(buf,0,MAX_PACKET_LENGTH);
    int length = sizeof(clientaddr);

    int clientRecord[FD_SETSIZE];
    int index = 0;
    for(; index < FD_SETSIZE; index++)
        clientRecord[index] = -1;
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(servfd,&readSet);
    int maxfd = servfd;

    for(;;)
    {
        clientfd = accept(servfd, (struct sockaddr *)&clientaddr,&length);

        for(index = 0; index < FD_SETSIZE; index++)
        {
            if(clientRecord[index] < 0)
            {
                clientRecord[index] = clientfd;
                break;
            }
        }
        if(index == FD_SETSIZE)
        {
            printf("too many sockets.\n");
            break;
        }
        for(index = 0; index < FD_SETSIZE; index++)
        {
            if(clientRecord[index] > 0)
            {
                FD_SET(clientRecord[index],&readSet);
                maxfd = maxfd > clientRecord[index] ? maxfd : clientRecord[index];
            }
            else
                break;
        }

        struct timeval time;
        time.tv_sec = 10;
        time.tv_usec = 0;
        if(select(maxfd,&readSet,NULL,NULL,&time) <= 0)
            break;

        int sockfd;

        for(index = 0; index < FD_SETSIZE; index++)
        {
            if((sockfd = clientRecord[index]) < 0)
                continue;
            if(FD_ISSET(sockfd,&readSet))
            {
                while(1)
                {
                    recv(sockfd,buf,MAX_PACKET_LENGTH,0);
                    printf("%s\n",buf);
                    if(strcmp(buf,"end") == 0)
                        break;
                }
                closesocket(sockfd);
                clientRecord[index] = -1;
            }
        }
    }
    closesocket(servfd);
    return 0;
}
看到一个评论,说的比较在理,于是重新改写了一下,起码做到了真正的非IO阻塞了吧:
tcpclient:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

#define HOST_PORT               10000
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 2, 2 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return;
    }

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */

    if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup( );
        return;
    }
    int clientfd = socket(AF_INET, SOCK_STREAM, 0);
    if(clientfd < 0)
    {
        printf("client create socket failed.\n");
        return 0;
    }
    int on = 1;
    if(setsockopt(clientfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)) < 0)
    {
        printf("set socket option failed.\n");
        return 0;
    }
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(HOST_PORT);
    servaddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.56");

    char buf[BUFSIZ];
    memset(buf,0,BUFSIZ);
    strncpy(buf,"shawn's client",14);
    //buf[BUFSIZ] = '\0';

    if(connect(clientfd,(const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("%d\n",errno);
        return 0;
    }
    int index = 0;
    for(index = 0; index < 5; index++)
    {
        send(clientfd,buf,strlen(buf) + 1, 0);
        _sleep(10);
    }

    memset(buf,0,BUFSIZ);
    strcpy(buf,"end");
    send(clientfd,buf,strlen(buf) + 1, 0);
    closesocket(clientfd);

    getchar();
    return 0;
}
tcpserver.c:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define MAX_LISTEN_QUEUE_NUMBER                 10
#define HOST_PORT                               10000
#define MAX_PACKET_LENGTH                       1400
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 2, 2 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return 0;
    }

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */

    if ( LOBYTE( wsaData.wVersion ) != 2 ||
            HIBYTE( wsaData.wVersion ) != 2 )
    {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup( );
        return 0;
    }

    int servfd, clientfd;
    servfd = socket(AF_INET, SOCK_STREAM, 0);
    if(servfd < 0)
    {
        printf("server create socket failed.\n");
        return 0;
    }
    int on = 1;
    if(setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)) < 0)
    {
        printf("set socket option failed.\n");
        return 0;
    }
    struct sockaddr_in servaddr;
    struct sockaddr_in clientaddr;

    memset(&servaddr,0,sizeof(servaddr));
    memset(&clientaddr,0,sizeof(clientaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(HOST_PORT);
    servaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    if(bind(servfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("bind failed.\n");
        return 0;
    }
    if(listen(servfd,10) < 0)
    {
        printf("listen failed.\n");
        return 0;
    }
    char buf[MAX_PACKET_LENGTH];
    memset(buf,0,MAX_PACKET_LENGTH);
    int length = sizeof(clientaddr);

    int clientRecord[FD_SETSIZE];
    int index = 0;
    for(; index < FD_SETSIZE; index++)
        clientRecord[index] = -1;
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(servfd,&readSet);
    int maxfd = servfd;

    for(;;)
    {
        struct timeval time;
        time.tv_sec = 10;
        time.tv_usec = 0;
        if(select(maxfd,&readSet,NULL,NULL,&time) <= 0)
            continue;
        if(FD_ISSET(servfd,&readSet))
        {
            clientfd = accept(servfd, (struct sockaddr *)&clientaddr,&length);

            for(index = 0; index < FD_SETSIZE; index++)
            {
                if(clientRecord[index] < 0)
                {
                    clientRecord[index] = clientfd;
                    break;
                }
            }
            if(index == FD_SETSIZE)
            {
                printf("too many sockets.\n");
                break;
            }
        }
        for(index = 0; index < FD_SETSIZE; index++)
        {
            if(clientRecord[index] > 0)
            {
                FD_SET(clientRecord[index],&readSet);
                maxfd = maxfd > clientRecord[index] ? maxfd : clientRecord[index];
            }
            else
                break;
        }

        int sockfd;

        for(index = 0; index < FD_SETSIZE; index++)
        {
            if((sockfd = clientRecord[index]) < 0)
                continue;
            if(FD_ISSET(sockfd,&readSet))
            {
                while(1)
                {
                    recv(sockfd,buf,MAX_PACKET_LENGTH,0);
                    printf("%s\n",buf);
                    if(strcmp(buf,"end") == 0)
                        break;
                }
                closesocket(sockfd);
                clientRecord[index] = -1;
            }
        }
    }
    closesocket(servfd);
    return 0;
}

猜你喜欢

转载自itjiehun.iteye.com/blog/1167452