select函数怎么判断连接是否可写
select函数如何判断连接是否可写?
服务端我用select(0,NULL,&sfwrite,NULL,&tv)判断连接是否可写,然后写了一个只会接收的客户端
服务端我用了一下多线程,所以贴出部分代码
客户端很简单,全部代码如下:
但服务端怎么老返回-1???
------解决方案--------------------
这个调试下代码就知道了哇
------解决方案--------------------
查看select的返回值
------解决方案--------------------
WaitForSingleObject(hMutex,INFINITE); FD_ZERO(&sfwrite); for(int p=0;p<iTotalClient;p++) {
服务端我用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++) {