用select管理套接字的状态,套接字可读的时候如何判断该SOCKET是可以接收数据,还是SOCKET关闭?

解决方案 »

  1.   

    // Server.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "winsock.h"
    #include "io.h"
    #include "stdlib.h"
    #include <vector>using namespace std;#pragma comment(lib,"WSOCK32")int main(int argc, char* argv[])
    {
    int len;
    char buff[255];
    fd_set readfds;

    memset(buff,0,sizeof(buff));

    WSADATA wsdata;
    WSAStartup(0x0202,&wsdata);
    vector <SOCKET> SockList;
    vector <SOCKET>::iterator Iter;

    SOCKET ListenSocket,NewSocket;
    sockaddr_in s_in,new_s_in;
    s_in.sin_family = AF_INET;
    s_in.sin_addr.s_addr = htonl(INADDR_ANY);
    s_in.sin_port = htons(55555);

    ListenSocket=socket(AF_INET,SOCK_STREAM,0);

    if(ListenSocket==INVALID_SOCKET)
    {
    printf("\n Failed to setup socket!");
    return 0;
    } bind(ListenSocket,(struct sockaddr * )&s_in,sizeof(s_in)); listen(ListenSocket,5); printf("\n Waiting for client to connect..."); len=sizeof(new_s_in); FD_ZERO(&readfds);
    FD_SET(ListenSocket, &readfds);

    int nRet;
    for (;;)      
    { nRet = select(0, &readfds, NULL, NULL, NULL); // 判断监听套接字是否可读,如果可读,表示有连接请求
    if (FD_ISSET(ListenSocket, &readfds)) 

    NewSocket = accept(ListenSocket, (struct sockaddr *)&new_s_in,&len);  if(SockList.size()==63)
    {
    printf("此次连接被拒绝\n"); 
    closesocket(NewSocket); 
    continue;
    } else
    {      // 将套接字放入套接字容器 SockList.push_back(NewSocket);
    } } 
    for(Iter=SockList.begin();Iter!=SockList.end();) 
    {
    if(FD_ISSET(*Iter, &readfds))
    {
    nRet = recv(*Iter, buff, sizeof(buff), 0);  if(nRet>0)
    printf("\n %s", buff);  // 输出接受到的数据 

    else 
    {
      INT iError = ::WSAGetLastError();
      if  ((iError == WSAENETRESET ) ||
          ( iError == WSAECONNABORTED ) ||
          ( iError == WSAECONNRESET ) ||
                   ( iError == WSAEINVAL ) ||
                   ( nRet == 0 ) )
       {  //表明客户端已经断开
         closesocket(*Iter);
                  printf("\n Socket %d disconnect!",*Iter);
         Iter=SockList.erase(Iter);
         continue;    
                } 
             }     }
    Iter++;
    }  //更新套接字容器
    FD_ZERO(&readfds);
    FD_SET(ListenSocket, &readfds);
    for(Iter=SockList.begin();Iter!=SockList.end();Iter++)
    {
    FD_SET(*Iter,&readfds);
    }   
    } return 0;
    }