TCP/IP通讯,bind错误:10049
最近刚接触TCP/IP编程,出现问题了
我现在有一个别人已经做好服务端的机器,IP是192.168.1.144,端口用的是4998。
然后我也想做一个类似的程序。
做客户端的时候,也就是发起命令的部分的时候,运行都是没有问题的,也可以连接上144,于是我就继续做服务端,就是接收数据的部分,这个时候就出现错误了。
是在bind()的时候出错的,GetLastError()得到10049,MSDN解释是:The requested address is not valid in its context
不知道怎么解决
还有人说用select()模式比较好,到底是什么啊?还有说道阻塞,非阻塞。也不懂。代码都是我照葫芦画瓢,画出来的。
WSADATA wsa;
SOCKET sHost;
SOCKADDR_IN serAdd;
char sBuf[SOCKET_BUF_SIZE];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
MessageBox(L"WSAStartup failed\r\n");
return;
}
sHost = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sHost)
{
MessageBox(L"socket failed");
WSACleanup();
return;
}
serAdd.sin_family = AF_INET;
serAdd.sin_addr.s_addr = inet_addr("192.168.1.144");
serAdd.sin_port = htons(4998);
int nServAddlen(sizeof(serAdd));
retVal = connect(sHost,(LPSOCKADDR)&serAdd,sizeof(serAdd));
if(SOCKET_ERROR == retVal)
{
int nError = WSAGetLastError();
wchar_t sError[60];
wsprintf(sError,L"connect failed:%d",nError);
MessageBox(sError);
closesocket(sHost);
WSACleanup();
return;
}
ZeroMemory(sBuf,SOCKET_BUF_SIZE);
char *head = "GET /";
char Comm[128] = {0};
char *end = "\r\n\r\n";
strcpy(sBuf,head);
CString sStr;
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_SHOW);
pEdit->GetWindowText(sStr);
wchar_t *wsStr = sStr.GetBuffer(sStr.GetLength());
WideCharToMultiByte(0,0,wsStr,sStr.GetLength(),Comm,sStr.GetLength(),NULL,NULL);
strcat(sBuf,Comm);
strcat(sBuf,end);
retVal = send(sHost,sBuf,strlen(sBuf),0);
if(SOCKET_ERROR == retVal)
{
MessageBox(L"send() failed\r\n");
closesocket(sHost);
WSACleanup();
return;
}
Sleep(100);
closesocket(sHost);
WSACleanup();
以上是作为客户端的程序,运行OK
WSADATA wsd;
SOCKET sServer;
SOCKET sClient;
SOCKADDR_IN addServer;
char buf[SOCKET_BUF_SIZE];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
MessageBox(L"WSAStartup failed!\n");
return;
}
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
MessageBox(L"socket() failed\n");
WSACleanup();
return;
}
addServer.sin_family = AF_INET;
addServer.sin_port = htons(4998);
addServer.sin_addr.s_addr = inet_addr("192.168.1.144");
retVal = bind(sServer,(LPSOCKADDR)&addServer,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
int nError = GetLastError();
CString sError;
sError.Format(L"bind() failed:%d\n",nError); //10049 The requested address is not valid in its context
MessageBox(sError);
closesocket(sServer);
WSACleanup();
return;
}
retVal = listen(sServer,1);
if(SOCKET_ERROR == retVal)
{
MessageBox(L"listen() failed\n");
closesocket(sServer);
WSACleanup();
return;
}
sockaddr_in addClient;
int addClientLen = sizeof(addClient);
sClient = accept(sServer,(sockaddr FAR*)&addClient,&addClientLen);
if(INVALID_SOCKET == sClient)
{
MessageBox(L"accept() failed\n");
closesocket(sServer);
WSACleanup();
return;
}
wchar_t wsBuf[SOCKET_BUF_SIZE] = {0};
ZeroMemory(buf,SOCKET_BUF_SIZE);
retVal = recv(sClient,buf,SOCKET_BUF_SIZE,0);
if(retVal == SOCKET_ERROR)
{
MessageBox(L"recv() failed\n");
closesocket(sServer);
WSACleanup();
return;
}
MultiByteToWideChar(0,0,buf,strlen(buf)*2+1,wsBuf,strlen(buf));
MessageBox(wsBuf);
closesocket(sServer);
closesocket(sClient);
WSACleanup();
在作为服务端的时候就出现错误了