我一直试图用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
#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;
}发布于 2016-02-10 06:02:41
首先,请注意:您需要检查您调用的每个函数的返回值,如果返回值指示函数返回了一个错误,则只需打印出WSAGetLastError()的值。否则,您只会通过查看以前调用遗留下来的错误代码值来迷惑自己,而与最近的调用没有任何关系。也就是说,不是这样做的:
bind(sock_CONNECTION, (SOCKADDR *)&ADDRESS, AddressSize);
printf("Last error code was(3): %d\n", WSAGetLastError());..。你应该这么做:
if (bind(sock_CONNECTION, (SOCKADDR *)&ADDRESS, AddressSize) != 0)
{
printf("bind() failed, last error code was(3): %d\n", WSAGetLastError());
}..。你所调用的所有其他功能也是如此。(请注意,不同的函数返回不同的值以指示错误,因此您需要阅读每个函数的文档页,以找到正确的方法来测试返回值,以确定成功还是失败)
话虽如此,我认为具体的问题是:
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()的正确方法应该是如下所示:
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,而不管它们来自哪个网络接口。
// 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;https://stackoverflow.com/questions/35307583
复制相似问题