select函数怎么判断连接是否可写

select函数如何判断连接是否可写?
本帖最后由 nicholas199109 于 2013-01-07 22:25:47 编辑
服务端我用select(0,NULL,&sfwrite,NULL,&tv)判断连接是否可写,然后写了一个只会接收的客户端
服务端我用了一下多线程,所以贴出部分代码


DWORD WINAPI WriteThread(LPVOID lpParameter)
{
/*可写性检查*/
char sendBuffer[100]="hello world\n";
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
FD_ZERO(&sfwrite);
for(int p=0;p<iTotalClient;p++)
{
FD_SET(ClientArr[p],&sfread);
}

int iWriter=select(0,NULL,&sfwrite,NULL,&tv);
printf("此时总共有%d个客户连接,有%d个客户可写!\n",iTotalClient,iWriter);
if(iWriter==0)
{
printf("此时没有数据可写!\n");
ReleaseMutex(hMutex);
Sleep(5000);
continue;

}
for(int t=0;t<iTotalClient;t++)
{
if(FD_ISSET(ClientArr[t],&sfwrite)) 
{
int nSend=send(ClientArr[t],sendBuffer,strlen(sendBuffer),0);
if(nSend==SOCKET_ERROR)
printf("Client Socket %d 发送失败!",ClientArr[t]);
printf("Client Socket %d 发送成功!",ClientArr[t]);
}
}
Sleep(5000);
ReleaseMutex(hMutex);

}
return 0;
}

客户端很简单,全部代码如下:

#pragma comment(lib, "Ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL.                                  */
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
        SOCKADDR_IN addrSrv;//服务端信息
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_port=htons(6000);
addrSrv.sin_family=AF_INET;
        connect(sockClient,(sockaddr*)&addrSrv,sizeof(sockaddr));
char recvBuffer[100];
        recv(sockClient,recvBuffer,100,0);
        printf("%s",recvBuffer);
getchar();
closesocket(sockClient);
WSACleanup();
}


但服务端怎么老返回-1???

------解决方案--------------------
这个调试下代码就知道了哇
------解决方案--------------------
查看select的返回值
------解决方案--------------------
 WaitForSingleObject(hMutex,INFINITE);         FD_ZERO(&sfwrite);         for(int p=0;p<iTotalClient;p++)         {