c++ - winsock 总是在套接字上返回 -1

标签 c++ c sockets winsock

我正在尝试使用 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/

相关文章:

c++ - std::shared_ptr、std::weak_ptr 和控制 block

C++ 动态类型构造和检测

c - 在 Linux + Intel 驱动程序上启用合成时,OpenGL 应用程序会产生奇怪的效果

c - 在c中如何将int变量更改为字符串变量?

java - 在 Java 中配置套接字以使用小数据包

c++ - Clang的不同处理阶段

c++ - OpenGL 3.0 窗口碰撞检测

c - 为什么第二个代码出现段错误?

sockets - 本书 “Unix Networking Programming”中的拒绝服务攻击问题

python - 订阅多播组时,过滤来自组中其他主机的流量的最佳方法是什么?