Socket编程基础问题,关于listen和socketerror10014
最近在学网络编程,看《windows网络编程》,我按照第一个例子用C编写服务器端程序。阻塞模型,每次一执行就会返回:
We are awaiting a connection on port 5150.
accept failed with error 10014
我想这段话对于很多人来说都不陌生,我想为何listen的时候系统没有进入监听等待状态,直接执行accept,造成10014错误。这段代码的vb版本就能很好地执行。所以我想虽然报错是accept,但问题应该出在listen上面吧?
在线等求高人指点。
Socket error 10014 - Bad address
下面是源程序,我想大多数人都见过了。
// tcpserver.cpp : Defines the entry point for the console application.
#include <stdafx.h>
int main()
{
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
int Port=5150;
int Ret;
char DataBuffer[1024];
if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n", Ret);
return 0;
}
ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ListeningSocket == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return 0;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = Port;
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)))
{
printf("bind failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return 0;
}
if(listen(ListeningSocket,5) == SOCKET_ERROR)
{
printf("listen failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return 0;
}
printf("We are awaiting a connection on port %d.\n", Port);
NewConnection = accept(ListeningSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen);
if(NewConnection == INVALID_SOCKET)
{
printf("accept failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return 0;
}
printf("We successfully got a connection from %s:%d.\n",inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));
closesocket(ListeningSocket);
printf("We are waiting to receive data...\n");
if ((Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0)) == SOCKET_ERROR)
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(NewConnection);
WSACleanup();
return 0;
}
printf("We successfully received %d byte(s).%s\n", Ret, DataBuffer);
printf("We are now going to close the client connection.\n");
closesocket(NewConnection);
WSACleanup();
return 0;
}