首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WSA 10049无明显原因的错误

WSA 10049无明显原因的错误
EN

Stack Overflow用户
提问于 2016-02-10 05:33:06
回答 1查看 427关注 0票数 0

我一直试图用C++编写一个简单的聊天程序,并且遇到了一个套接字问题。以下代码正在返回

最后的错误代码是(1):0。

最后的错误代码是(2):0。

最后的错误码是(3):10049。

最后的错误码是(4):10022。

在检查MSDN页面是否存在WSA错误后,我发现10022表示无效参数,10049试图绑定到不可用地址。我的结论是,当我试图侦听一个未绑定的套接字时,10049错误导致了10022错误。

之后,尝试了几个不同的地址来查找任何可用地址,包括127.x.x.x、192.168.x.x、0.0.0.0,这些地址都没有工作。我跳过CMD,看到其他进程正在使用这些addressesCan

代码语言:javascript
复制
#include "stdafx.h"
using namespace std;

int main()
{
     long SUCCESSFUL;
     WSAData WinSockData;
     WORD DLLVERSION;

     DLLVERSION = MAKEWORD(2, 1);

     SUCCESSFUL = WSAStartup(DLLVERSION, &WinSockData);

     SOCKADDR_IN ADDRESS;
     int AddressSize = sizeof(ADDRESS);

     SOCKET sock_CONNECTION;

     const CHAR addr[15] = "127.0.0.1";
     char buffer [sizeof(in_addr)];

     printf("Last error code was(1): %d\n", WSAGetLastError());

     sock_CONNECTION = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     ADDRESS.sin_addr.s_addr = inet_pton(AF_INET, (const CHAR*)&addr, &buffer);
     ADDRESS.sin_family = AF_INET;
     ADDRESS.sin_port = htons(444);

     printf("Last error code was(2): %d\n", WSAGetLastError());


     bind(sock_CONNECTION, (SOCKADDR *)&ADDRESS, AddressSize);

     printf("Last error code was(3): %d\n", WSAGetLastError());

     listen(sock_CONNECTION, 5);

     printf("Last error code was(4): %d\n", WSAGetLastError());
     //note to self: don't use %x when referring to WSAGetLastError, returns untrue value outside WSAerror regular field
     pause();
     return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-10 06:02:41

首先,请注意:您需要检查您调用的每个函数的返回值,如果返回值指示函数返回了一个错误,则只需打印出WSAGetLastError()的值。否则,您只会通过查看以前调用遗留下来的错误代码值来迷惑自己,而与最近的调用没有任何关系。也就是说,不是这样做的:

代码语言:javascript
复制
bind(sock_CONNECTION, (SOCKADDR *)&ADDRESS, AddressSize);
printf("Last error code was(3): %d\n", WSAGetLastError());

..。你应该这么做:

代码语言:javascript
复制
if (bind(sock_CONNECTION, (SOCKADDR *)&ADDRESS, AddressSize) != 0)
{
    printf("bind() failed, last error code was(3): %d\n", WSAGetLastError());
}

..。你所调用的所有其他功能也是如此。(请注意,不同的函数返回不同的值以指示错误,因此您需要阅读每个函数的文档页,以找到正确的方法来测试返回值,以确定成功还是失败)

话虽如此,我认为具体的问题是:

代码语言:javascript
复制
 ADDRESS.sin_addr.s_addr = inet_pton(AF_INET, (const CHAR*)&addr, &buffer);

pton不返回地址;而是返回“如果该地址对指定地址系列有效,则返回0,如果该地址在指定地址系列中不可解析,则返回-1”(在这种情况下,将设置errno )。因此,您要写入ADDRESS.sin_addr.s_addr的值为-1、0或1;这些都不是bind()想要使用的有效地址。(实际上可以使用0;见下文,但调用仍然错误)

调用inet_pton()的正确方法应该是如下所示:

代码语言:javascript
复制
int result = inet_pton(AF_INET, addr, &ADDRESS.sin_addr);
if (result != 1) printf("inet_pton() failed, error code %d\n", WSAGetLastError());

..。但我怀疑,对于您可能想做的事情(在任何网络接口上接受连接),您根本不需要调用inet_pton()。相反,您可以将ADDRESS.sin_addr.s_addr设置为INADDR_ANY,然后bind()将以这样的方式绑定您的套接字,即它将接受传入的TCP,而不管它们来自哪个网络接口。

代码语言:javascript
复制
 // INADDR_ANY (aka 0) means "I don't care which network interface, accept connections on any of them"
 ADDRESS.sin_addr.s_addr = INADDR_ANY;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35307583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档