我正在尝试使用 winsock2.h 在端口 69 上连接到我的服务器。一切似乎都在正确编译,但在调试器中,maincommsock 始终等于 -1。我似乎无法弄清楚为什么它不起作用,需要帮助。对套接字编程不是很有经验,不知道现在该做什么!。任何帮助将不胜感激。
我不是 100% 确定还可以尝试什么。这基本上是一个在套接字上建立连接并将连接设置为 true 的函数,以便它可以循环直到连接。
int maincommsock;
bool connection = false;
static void establishconn() {
maincommsock = socket(AF_INET, SOCK_STREAM, 0);
if (maincommsock == -1) {
connection = false;
}
//OutputDebugString((LPCSTR)commservers[1]);
/*
struct hostent *host;
if ((host = gethostbyname(SERV_ADDR)) == NULL) {
connection = FALSE;
}
*/
SOCKADDR_IN sockaddr;
sockaddr.sin_port = 69;
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//sockaddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
if (connect(maincommsock, (SOCKADDR *)(&sockaddr), sizeof(sockaddr)) != 1) {
connection = true;
}
}
编辑
我使用了 WSAStartup,我目前收到的错误是无法建立连接,因为目标机器主动拒绝了它。”
编辑 2
在端口上使用 htons。它说操作成功完成,但服务器上没有显示任何连接
编辑 3
我将在 Linux 上对其进行测试,以确保它实际上是服务器端错误,而不是我的代码的问题。我会及时通知你们。
最佳答案
你的错误处理有点欠缺。
首先,当确实发生错误时,请停止您正在做的事情。现在,您并没有停下来,您只是继续进行下一个 API 调用,就好像没有发生错误一样。
其次,您对 connect()
的错误处理是错误的。 connect()
成功时返回 0,失败时返回 -1,但您正在检查其返回值是否为 != 1
,因此您将以相同的方式处理成功和失败.
试试这个:
static SOCKET establishconn(const char *addr, u_short port)
{
SOCKET commsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (commsock == INVALID_SOCKET)
return INVALID_SOCKET;
//OutputDebugStringA(addr);
SOCKADDR_IN sockaddr = {};
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
sockaddr.sin_addr.s_addr = inet_addr(addr);
if (sockaddr.sin_addr.s_addr == INADDR_NONE)
{
struct hostent *host = gethostbyname(addr);
if (!host)
{
closesocket(commsock);
return INVALID_SOCKET;
}
sockaddr.sin_addr.s_addr = *((u_long*) host->h_addr);
}
if (connect(commsock, (SOCKADDR &sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(commsock);
return INVALID_SOCKET;
}
return commsock;
}
然后你可以这样做:
WSAStartup(...);
...
SOCKET maincommsock = establishconn("127.0.0.1", 69);
if (maincommsock != INVALID_SOCKET)
{
...
closesocket(maincommsock);
}
...
WSACleanup();
关于c++ - winsock 总是在套接字上返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54119198/