recv()是否直接返回?如何控制参数让他直接返回?
72193 2005-10-15 10:43:01 如题,
还有一个问题,下面代码中:
msgsock,和 sock有什么区别?
为什么 send(sock) 但是 recv(msgsock) ?
///////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
int sock,length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int rval;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2,0);
int err=WSAStartup(wVersionRequested,&wsaData);
//如果不能初始化WinSock,退出
if(err==-1){
perror("WSAStartup");
exit(1);
}
//调用socket函数,建立自己的套接口
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0){
perror("Opening stream socket");
exit(1);
}
server.sin_family = AF_INET;
server.sin_port = htons(7016);
server.sin_addr.s_addr=INADDR_ANY;
//调用bingd()函数建立服务器本地的绑定
if(bind(sock,(const struct sockaddr*)&server,sizeof(server))<0){
perror("binding stream socket");
exit(1);
}
length=sizeof(server);
//getsockname()函数获取一个套接口的本地名字
if(getsockname(sock,(struct sockaddr*)&server,&length)<0){
perror("GETING socket name");
exit(1);
}
printf("socket port #%d\n",ntohs(server.sin_port));
//调用listen()函数,表示开始侦听
listen(sock,5);
do{
//通过accept()调用等待接受连接
msgsock=accept(sock,0,(int*)0);
printf("Have client connected.\n");
if(msgsock==-1)
perror("accept");
else
do{
memset(buf,0,sizeof(buf));
//调用recv函数接收数据
if((rval=recv(msgsock,buf,1024,0))<0)
{
rval = WSAGetLastError();
if(rval==WSAECONNRESET)
continue ;
printf("error code = %d\n",rval);
if(rval==WSAEINPROGRESS)
printf("Hello 1\n");
if(rval==WSAENETRESET)
printf("Hello 2\n");
if(rval==WSAENOTSOCK)
printf("Hello 3\n");
if(rval==WSAEOPNOTSUPP)
printf("Hello 4\n");
perror("reading stream message ");
getchar();
exit(1);
}
else if(rval==0)
printf("ending connection\n");
else
printf("--->%s\n",buf);
}while(rval!=0);
//调用函数closesocket()关闭套接口
closesocket(msgsock);
}while(1);
WSACleanup();
printf("server stop !\n");
return 0;
}