刚学socket编程,想让recv函数阻塞住,写了个简单的服务器端和客户端程序做实验,奇怪的是,默认工作在阻塞模式下的recv函数为什么没有阻塞住?为了这个问题,想了好久,试了好久,还是没有阻塞住,哪位高手帮忙看看吧,谢谢了服务器端为:
#include <winsock2.h>
#include <iostream.h>
#pragma comment(lib,"WS2_32")int main()
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
} SOCKET sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sListen==INVALID_SOCKET)
{
cout<<"failed socket()"<<endl;
return 0;
} sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(4567);
sin.sin_addr.S_un.S_addr=INADDR_ANY;

if(bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{
cout<<"failed bind()"<<endl;
return 0;
} if(listen(sListen,3)==SOCKET_ERROR)
{
cout<<"failed listen()"<<endl;
return 0;
} sockaddr_in remoteAddr;
int nAddrLen=sizeof(remoteAddr); SOCKET sClient;
char szText[]="TCP Server Demo!\t\n"; sClient=accept(sListen,(sockaddr*)&remoteAddr,&nAddrLen);
if(sClient==INVALID_SOCKET)
{
cout<<"failed accept()"<<endl;
return 0;
} cout<<"a new connection:"<<inet_ntoa(remoteAddr.sin_addr)<<endl;
// send(sClient,szText,strlen(szText),0); //我将这个send函数注释起来,是为了让套接字上没有可读的数据,想让
                                                       //客户端的recv函数阻塞住,是不是这样并没有达到“套接字上没有可读”
                                                       //的条件,如果这样没有达到,那该怎么让套接字上没有可读的数据呢?
closesocket(sClient); closesocket(sListen);
system("pause");
return 0;
}
客户端为:
#include <winsock2.h>
#include <iostream.h>
#pragma comment(lib,"WS2_32")int main()
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(2,2);
if(WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
} SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
{
cout<<"failed socket()"<<endl;
return 0;
} sockaddr_in addr;
int nLen=sizeof(addr);
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); if(connect(s,(sockaddr*)&addr,nLen)==-1)
{
cout<<"failed connect()"<<endl;
return 0;
} char buff[256];
int nRecv=recv(s,buff,256,0);     //recv函数在阻塞模式下时,在套接字上没有可读的数据时会阻塞住,直到有数据才返回,但是
                                          //当我运行了服务器端程序后,再单步执行客户端程序时,发现这个函数并没有阻塞住,而是返回
                                          //了0,既nRecv的值为0,这里为什么没有阻塞住呢?
if(nRecv>0)
{
buff[nRecv]='\0';
cout<<"received data:"<<buff<<endl;
}
closesocket(s);
system("pause");
return 0;
}