TCP/IP通讯,bind错误:10049

cobra_chen 2010-08-19 06:22:28
最近刚接触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();

在作为服务端的时候就出现错误了
...全文
5315 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Night 2010-08-25
  • 打赏
  • 举报
回复
!!!!!!!!!!!!!!
ctest_ 2010-08-24
  • 打赏
  • 举报
回复
通常每个套接字地址 (协议/网络地址/端口)只允许使用1次
晓灬佩恩 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 visualeleven 的回复:]
10048: Only one usage of each socket address (protocol/network address/port) is normally permitted.
10049: The requested address is not valid in its context.
[/Quote]
装了360的话,也可以用它去检查下你的电脑网络
错误都帮你指出来了~
ljhnew 2010-08-20
  • 打赏
  • 举报
回复
如果是windows系统,用命令行,执行netstat -a看看网络状态,检查IP和端口情况
Eleven 2010-08-20
  • 打赏
  • 举报
回复
10048: Only one usage of each socket address (protocol/network address/port) is normally permitted.
10049: The requested address is not valid in its context.
cobra_chen 2010-08-20
  • 打赏
  • 举报
回复
端口也没有被占用
cobra_chen 2010-08-20
  • 打赏
  • 举报
回复
昨天执行是10049,今天运行报出10048错误。
崩溃。。。。。

防火墙都已经关了,还是报出同样的错误
lingdu787 2010-08-20
  • 打赏
  • 举报
回复
addServer.sin_addr.s_addr 改成addServer.sin_addr.s_addr=INADDR_ANY试试看,
可能你的IP地址发生了改变,bind时就出错了。
云瑀 2010-08-19
  • 打赏
  • 举报
回复
防火墙禁止了吗
或是有其他程序占用port
还是有多张网卡?
ljhnew 2010-08-19
  • 打赏
  • 举报
回复
是不是在这个114机器上,还有一个程序也bind了这个IP的这个端口?

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧