select函数如何判断连接是否可写?

nicholas199109 2013-01-07 10:22:30
服务端我用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???
...全文
418 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fang 2013-01-08
  • 打赏
  • 举报
回复
int iWriter=select(0,NULL,&sfwrite,NULL,&tv); 你的tv是怎么设置的,如果都是0立即返回出现-1的情况非常大。 tv.tv_sec = 0; tv.tv_usec = 200;
yaozhiyong110 2013-01-08
  • 打赏
  • 举报
回复
WaitForSingleObject(hMutex,INFINITE); FD_ZERO(&sfwrite); for(int p=0;p<iTotalClient;p++) { FD_SET(ClientArr[p],&sfread); } sfwrite你都没关联socket 当然只有-1啊
jimette 2013-01-08
  • 打赏
  • 举报
回复
查看select的返回值
hurryboylqs 2013-01-07
  • 打赏
  • 举报
回复
这个调试下代码就知道了哇

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧