我在dotnet2003下写了如下代码,程序运行后提示accept error.程序也不阻塞,直接退出.
但是把ClientAddrLen = 0;赋初值的语句去掉accept语句返回正常,程序也处于阻塞状态,等待客户端连接.谁能给我解释一下这是为什么?代码如下:
// tcpserver.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET ListenSocket;
SOCKET ConnectSocket;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
int PortNo;
int Ret; /* Init variable */
memset(&wsaData,0x00,sizeof(wsaData));
memset(&ListenSocket,0x00,sizeof(ListenSocket));
memset(&ConnectSocket,0x00,sizeof(ConnectSocket));
memset(&ServerAddr,0x00,sizeof(ServerAddr));
memset(&ClientAddr,0x00,sizeof(ClientAddr));
//ClientAddrLen = 0;
PortNo = 5150;
Ret = 0; /* Init Winsock */
if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0){
printf("Winsock init error.\n");
return(-1);
} /* Create listen socket */
if((ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET){
WSACleanup();
printf("Socket create failed.\n");
return(-1);
} /* Set SOCKADDR_IN structure */
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(PortNo);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if((Ret = bind(ListenSocket,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))) == SOCKET_ERROR){
closesocket(ListenSocket);
WSACleanup();
printf("bind error.\n");
return(-1);
} /* Listen Port */
if((Ret = listen(ListenSocket,1)) == SOCKET_ERROR){
closesocket(ListenSocket);
WSACleanup();
printf("listen error.\n");
return(-1);
} /* Create connection socket */
if((ConnectSocket = accept(ListenSocket,(struct sockaddr *)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET){
closesocket(ListenSocket);
WSACleanup();
printf("accept error.\n");
return(-1);
}
printf("%d\n",ClientAddrLen); /* Print client's IP */
printf("You got a connection from %s\n.",inet_ntoa(ClientAddr.sin_addr)); /* send to the client welcome message */
send(ConnectSocket,"Welcome to my server.\n",22,0); closesocket(ConnectSocket);
closesocket(ListenSocket);
WSACleanup(); return 0;
}
但是把ClientAddrLen = 0;赋初值的语句去掉accept语句返回正常,程序也处于阻塞状态,等待客户端连接.谁能给我解释一下这是为什么?代码如下:
// tcpserver.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET ListenSocket;
SOCKET ConnectSocket;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
int PortNo;
int Ret; /* Init variable */
memset(&wsaData,0x00,sizeof(wsaData));
memset(&ListenSocket,0x00,sizeof(ListenSocket));
memset(&ConnectSocket,0x00,sizeof(ConnectSocket));
memset(&ServerAddr,0x00,sizeof(ServerAddr));
memset(&ClientAddr,0x00,sizeof(ClientAddr));
//ClientAddrLen = 0;
PortNo = 5150;
Ret = 0; /* Init Winsock */
if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0){
printf("Winsock init error.\n");
return(-1);
} /* Create listen socket */
if((ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET){
WSACleanup();
printf("Socket create failed.\n");
return(-1);
} /* Set SOCKADDR_IN structure */
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(PortNo);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if((Ret = bind(ListenSocket,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))) == SOCKET_ERROR){
closesocket(ListenSocket);
WSACleanup();
printf("bind error.\n");
return(-1);
} /* Listen Port */
if((Ret = listen(ListenSocket,1)) == SOCKET_ERROR){
closesocket(ListenSocket);
WSACleanup();
printf("listen error.\n");
return(-1);
} /* Create connection socket */
if((ConnectSocket = accept(ListenSocket,(struct sockaddr *)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET){
closesocket(ListenSocket);
WSACleanup();
printf("accept error.\n");
return(-1);
}
printf("%d\n",ClientAddrLen); /* Print client's IP */
printf("You got a connection from %s\n.",inet_ntoa(ClientAddr.sin_addr)); /* send to the client welcome message */
send(ConnectSocket,"Welcome to my server.\n",22,0); closesocket(ConnectSocket);
closesocket(ListenSocket);
WSACleanup(); return 0;
}
这样就可以咯 _-##
ClientAddrLen=sizeof(ClientAddr); //*********大小都没求出来 还想调用正确啊
if((ConnectSocket = accept(ListenSocket,(struct sockaddr *)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET){
closesocket(ListenSocket);
WSACleanup();
printf("accept error.\n");
return(-1);
}
printf("%d\n",ClientAddrLen);