select收数据

之前写的服务器端 表示都无法收到client发的数据,找不到原因,原来是有个socket接收数据缓冲木有设置,现在设置后就可以正常收到数据啦!

server端:

select收数据
#include <winsock.h>

#include <stdio.h>



#include <string>



#pragma comment(lib, "ws2_32.lib")



#define MYPORT 1234    // the port users will be connecting to

#define BACKLOG 5     // how many pending connections queue will hold

#define BUF_SIZE 200

int fd_A[BACKLOG];    // accepted connection fd

int conn_amount;    // current connection amount



void showclient()

{

    int i;

    printf("client amount: %d\n", conn_amount);

    for (i = 0; i < BACKLOG; i++) 

    {

    printf("[%d]:%d  ", i, fd_A[i]);

    }

    printf("\n\n");

}



int main(void)

{

    WSADATA     wsaData;

    WSAStartup(0x0202, &wsaData);

    int sock_fd, new_fd;  // listen on sock_fd, new connection on new_fd



    struct sockaddr_in server_addr;    // server address information

    struct sockaddr_in client_addr; // connector's address information

    int sin_size;

    int yes = 1;

    char buf[BUF_SIZE];

    int ret;

    int i;



    if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {



        perror("socket");

        exit(1);

    }



    //这一步很重要,不然数据可能收不到

    int nRecvBuf = 32 * 1024; //设置为32K

    if (setsockopt(sock_fd,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)) == -1) {

        perror("setsockopt");

        exit(1);

    }



    server_addr.sin_family = AF_INET;         // host byte order

    server_addr.sin_port = htons(MYPORT);     // short, network byte order

    server_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP

    memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero));



    if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) 

    {

        perror("bind");

        exit(1);

    }



    if (listen(sock_fd, BACKLOG) == -1) 

    {

        perror("listen");

        exit(1);

    }



    printf("listen port %d\n", MYPORT);



    fd_set fdsr;

    int maxsock;

    struct timeval tv;

    conn_amount = 0;

    sin_size = sizeof(client_addr);

    maxsock = sock_fd;



    while (1) 

    {

        FD_ZERO(&fdsr);



        FD_SET(sock_fd, &fdsr);

        // timeout setting

        tv.tv_sec = 10;

        tv.tv_usec = 0;

        // add active connection to fd set

        for (i = 0; i < BACKLOG; i++) 

        {

            if (fd_A[i] != 0)

            {

                FD_SET(fd_A[i], &fdsr);

            }

        }



        ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv);

        if (ret < 0)

        {

            perror("select");

            break;



        } 

        else if (ret == 0) 

        {

            printf("timeout\n");

            continue;

        }



        // check every fd in the set

        for (i = 0; i < conn_amount; i++) 

        {

            if(fd_A[i] > 0)

            {

                if (FD_ISSET(fd_A[i], &fdsr)) 

                {

                    ret = recv(fd_A[i], buf, sizeof(buf), 0);

                    if (ret <= 0) 

                    {        // client close

                        printf("client[%d] close\n", i);

                        --conn_amount;

                        closesocket(fd_A[i]);

                        FD_CLR(fd_A[i], &fdsr);

                        fd_A[i] = 0;

                    } 

                    else 

                    {

                        if (ret < BUF_SIZE)

                            memset(&buf[ret], '\0', 1);

                        printf("client[%d] send:%s\n", i, buf);

                    }

                }

            }

        }

        // check whether a new connection comes

        if (FD_ISSET(sock_fd, &fdsr)) 

        {

            new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size);

            if (new_fd <= 0) 

            {

                perror("accept");

                continue;

            }

            // add to fd queue

            if (conn_amount < BACKLOG) 

            {

                for (int j = 0; j < BACKLOG; ++j)

                {

                    if (fd_A[j] == 0)

                    {

                        fd_A[j] = new_fd;

                        printf("new connection client[%d] %s:%d\n", conn_amount,inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

                        if (new_fd > maxsock)

                        {

                            maxsock = new_fd;

                        }

                        ++conn_amount;

                        break;

                    }

                }

            }

            else 

            {

                printf("max connections arrive, exit\n");

                send(new_fd, "bye", 4, 0);

                closesocket(new_fd);

                break;

            }

        }

    }

    // close other connections

    for (i = 0; i < BACKLOG; i++) 

    {

        if (fd_A[i] != 0) 

        {

            closesocket(fd_A[i]);

        }

    }

    exit(0);



}
View Code

 

select收数据
#include <stdio.h>

#include <WinSock2.h>

#pragma comment(lib, "ws2_32")



#define MYPORT 1234    // the port users will be connecting to



void CleanUpSocket( SOCKET clientSocket ) 

{

    printf("SocketError:%d\n",WSAGetLastError());

    closesocket(clientSocket);

    WSACleanup();

}



int BytesSum = 0;



int main() 

{

    int iResult;

    WORD wVersionRequested;

    WSADATA wsaData;

    SOCKET clientSocket;

    struct sockaddr_in clientService;



    wVersionRequested = MAKEWORD(2, 2);

    

    /* initialize windows socket */

    iResult = WSAStartup(wVersionRequested, &wsaData);

    if (iResult != 0) 

    {

        printf("WSAStartup failed with error: %d\n", iResult);

        return -1;

    } 

    else 

    {

        printf("WSAStartup succeeded!\n");

    }



    clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (clientSocket == INVALID_SOCKET) 

    {

        printf("create socket failed with error: %d\n", WSAGetLastError());

        WSACleanup();

        return -1;

    } 

    else 

    {

        printf("create socket(%d) succeeded!\n", clientSocket);

    }



    clientService.sin_family = AF_INET;

    clientService.sin_port = htons(MYPORT);

    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");

    iResult = connect(clientSocket, (SOCKADDR *) &clientService, sizeof(clientService));

    if (iResult == SOCKET_ERROR) 

    {

        CleanUpSocket(clientSocket);

        return -1;

    } 

    else 

    {

        printf("connect succeed!\n");

    }



    char lBuf[100] = "Hello Kitty!";

    int i = 0;

    char lrecvbyf[1024];



    while(++i < 20)

    {

        int lResult = send(clientSocket, lBuf, strlen(lBuf)+1,0);

        if (SOCKET_ERROR == lResult)

        {

            CleanUpSocket(clientSocket);

            return 0;

        }

        else

        {

            BytesSum += lResult;

            printf("BytesSum(%d) Bytes Send:%d\n",BytesSum,lResult);

        }



        //lResult = recv(clientSocket, lrecvbyf, strlen(lrecvbyf)+1,0);

        //if (SOCKET_ERROR == lResult)

        //{

        //    CleanUpSocket(clientSocket);

        //    return 0;

        //}

        //else

        //{

        //    lrecvbyf[lResult] = '\0';

        //    printf("recv:%s\n",lrecvbyf);

        //    printf("BytesSum(%d) Bytes Send:%d\n",BytesSum,lResult);

        //}

        

    }



    closesocket(clientSocket);

    WSACleanup();



    return 0;

}
View Code

ok,继续努力,改进server端的缺点。

参考代码:http://www.cnblogs.com/faraway/archive/2009/03/06/1404449.html

你可能感兴趣的:(select)