Receive=accept(SocketSvr,(struct sockaddr*)&client,&ClientLen);
if (Receive == INVALID_SOCKET)
{
MessageBox("accept() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
char buffer[50];
sprintf(buffer,"connect from %s",inet_ntoa(client.sin_addr));
MessageBox( buffer); sprintf(buffer,"%s:欢迎来到深蓝空间",inet_ntoa(client.sin_addr));
if(send(Receive,buffer,sizeof(buffer)+1,0) == SOCKET_ERROR)
{
MessageBox("send() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
char recvBuffer[100]; if(recv(Receive,recvBuffer,100,0) == SOCKET_ERROR)
{
MessageBox("recv() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
MessageBox(recvBuffer);执行到accept时就不动了,直到客户端发送消息才有反应,如果客户端不发消息了,服务端界面就没有响应了。我看到网上有人说用多线程,怎么写?
if (Receive == INVALID_SOCKET)
{
MessageBox("accept() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
char buffer[50];
sprintf(buffer,"connect from %s",inet_ntoa(client.sin_addr));
MessageBox( buffer); sprintf(buffer,"%s:欢迎来到深蓝空间",inet_ntoa(client.sin_addr));
if(send(Receive,buffer,sizeof(buffer)+1,0) == SOCKET_ERROR)
{
MessageBox("send() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
char recvBuffer[100]; if(recv(Receive,recvBuffer,100,0) == SOCKET_ERROR)
{
MessageBox("recv() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
MessageBox(recvBuffer);执行到accept时就不动了,直到客户端发送消息才有反应,如果客户端不发消息了,服务端界面就没有响应了。我看到网上有人说用多线程,怎么写?
启动一个select线程
2008年07月18日 周五 综合场(朝阳人才市场)奥运会北京地区最后的几场招聘会,请大家帮我转发一下,谢谢!
让更多的兄弟姐妹找到好的工作!否则这些求职者将要等到9月20日之后,才会开展。
招聘会
北京招聘会
招聘会 http://www.palmjob.net/zhpd/
北京招聘会 http://www.palmjob.net/zhpd/bjindex.jsp
我在网上找了个select()方法,但是还是不行。
运行到select函数时,服务端还是进入等待状态,客户端发消息后,才会继续运行。fd_set fdSocket; // 所有可用套节字集合
FD_ZERO(&fdSocket);
FD_SET(SocketSvr, &fdSocket);while(1)
{
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] == SocketSvr)
{
if (fdSocket.fd_count < FD_SETSIZE)
{
Receive=WSAAccept(SocketSvr,(struct sockaddr*)&client,&ClientLen,NULL,0);
FD_SET(Receive,&fdSocket);
if (Receive == INVALID_SOCKET)
{
MessageBox("accept() failed");
return 0;
}
char buffer[50];
sprintf(buffer,"connect from %s",inet_ntoa(client.sin_addr));
MessageBox( buffer);
sprintf(buffer,"欢迎来到深蓝空间");
if(send(Receive,buffer,sizeof(buffer)+1,0) == SOCKET_ERROR)
{
MessageBox("send() failed“);
return 0;
} }
}
else
{
char recvBuffer[100];
if(recv(Receive,recvBuffer,100,0) == SOCKET_ERROR)
{
MessageBox("recv() failed: %d\n", (const char*)WSAGetLastError());
return 0;
}
else
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i],&fdSocket);
}
MessageBox(recvBuffer);
}
}
}
}
else
{
MessageBox("failed connect");
break;
}
}
怎么还没解决吗?工程小的话 你把代码发我 我帮你改下:[email protected]
{
int nRet = select(0,&fdRead,NULL,NULL,NULL); if(nRet>0)
Receive=accept(SocketSvr,(struct sockaddr*)&client,&ClientLen);
else if(nRet == 0)
{
//Sleep(5000); //也可以不用Sleep;因为select本身会用掉你设的时间的;
}
else
{
int nErr = getlasterror();
TRACE("nErr = %d\n",nErr); //看一下是什么错误;
break; //跳出循环
}
}fdRead这个结构体有一个变量参数是设select的时间的,可以设为10秒左右。
中间哪个Sleep我忘记是设好还是不设好了,你可以看下你的cpu,如果不用sleep,并不站多大cpu的话就可以不用了。Sleep主要是为了把cpu时间片分给别的线程用。
accept返回的是你侦听到的客户端把好象,侦听到以后你就可以与它进行send与recv了。后边的你自己写你的程序把。
好运!
用了MFC消息响应