请教:
int WSAInit()
{
WORD wVersionRequest;
WSADATA wsData;
int err;
wVersionRequest = MAKEWORD(2,2);
err = WSAStartup(wVersionRequest, &wsData);
return 0;
}int main()
{
if(WSAInit())//加载套接字库
{
cout << "加载套接字库失败" << endl;
return -1;
} SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//创建用于监听的套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; //绑定
if(bind(sockSrv, (const SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout << "绑定失败" << endl;
return -1;
} listen(sockSrv, 5);
cout << "开始监听..." << endl; fd_set fdSocket;  
FD_ZERO(&fdSocket); //清空集合中所有的元素
FD_SET(sockSrv, &fdSocket); //将 sockSrv 加入 fdSocket 集合 while(TRUE)
{

fd_set fdRead = fdSocket; 
int nRet = select(0, &fdRead, NULL, NULL, NULL);
if(nRet > 0)
{
for(int i=0; i<(int)fdSocket.fd_count; ++i)
{
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if(fdSocket.fd_array[i] == sockSrv)
{
if(fdSocket.fd_count < FD_SETSIZE)
{
SOCKADDR_IN addrClient;  
int len = sizeof(SOCKADDR);  SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
cout << "收到连接:" << inet_ntoa(addrClient.sin_addr) << "[" << fdSocket.fd_count - 1 << "]" << endl; }
else
{
cout << "连接过多" << endl;
continue;
}
}
else
{
char strRecv[256];
int nRecv = recv(fdSocket.fd_array[i], strRecv, 256, 0);
if(nRecv > 0)
{
strRecv[nRecv] = '\0';
cout << "收到数据:" << strRecv << endl;
}
else
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
else
{
cout << "select 失败" << endl;
break;
}
} return 0;
}
请教:
1:
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
这句话的作用是什么?
和 fdRead 比较 有什么意义?2:
if(fdSocket.fd_array[i] == sockSrv)
这句话是什么意思?
为什么是 if(fdSocket.fd_array[i] == sockSrv) 
{
    //为什么是执行这里
SOCKADDR_IN addrClient;        //客户端地址
int len = sizeof(SOCKADDR);    //长度  SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
}
else
{
//为什么是这行这里
char strRecv[256];
int nRecv = recv(fdSocket.fd_array[i], strRecv, 256, 0);
}谢谢!

解决方案 »

  1.   

    1 找出当前有需要处理事件的Socket2 因为fdSocket.fd_array里面有监听Socket,通过:
    FD_SET(sockSrv, &fdSocket); //将 sockSrv 加入 fdSocket 集合
    也有与客户端连接进行读写的Socket,通过:
    FD_SET(sockClient, &fdSocket); //加入到 fdSocket
    加入的。所以要确定(if(fdSocket.fd_array[i] == sockSrv))当前处理的是哪一个(种)Socket,分别采取不同的行动,也就是if/else里的两种行动。
      

  2.   

    谢谢~int nRet = select(0, &fdRead, NULL, NULL, NULL);fdread 里
    监听连接的 socket 

    数据变化的是这个意思不?
      

  3.   

    select函数的意思是,当fdRead里面的某个Socket有请求的状态变化的时候,比如你这里是有数据需要读取,select函数返回,然后去检测到底是哪个Socket状态变化了,这是后面的代码做的事。