【问题标题】:Problem creating socket with C++ in winsock2在 winsock2 中使用 C++ 创建套接字的问题
【发布时间】:2010-03-21 00:53:44
【问题描述】:

我遇到了一个让我头疼的最奇怪的问题。考虑以下代码:

// Create and bind socket
 std::map<Connection, bool> clients;
 unsigned short port=6222;
 struct sockaddr_in local_address, from_address;
 int result;
 char buffer[10000];
 SOCKET receive_socket;
 local_address.sin_family = AF_INET;
 local_address.sin_addr.s_addr = INADDR_ANY;
 local_address.sin_port = htons(port);
 receive_socket = socket(AF_INET,SOCK_DGRAM,0);

发生了什么是receive_socket 没有绑定,我得到了SOCKET_ERROR。当我调试程序并检查receive_socket时,它似乎只是乱码。我在“std::map”行上放了一个断点。当我进入上述代码的每一行时,调试光标会直接从“无符号短端口”行跳转到第一个“local_address.sin”行,即使我正在使用步进(F11),它也不会停止struct、int、char 或 SOCKET 行,它会直接跳过它们。

此时,我将鼠标悬停在 local_address、from_address、result、buffer 和 receive_socket 上。他们都充满了乱码。这是因为我还没有定义这些变量吗?我还注意到,当我到达上述代码的底部时,local_address.sin_port 设置为 19992,但应该是 6222?

编辑:这是我的绑定代码,因为 if 语句为真而失败:

if(bind( receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR) 
    {
        closesocket(receive_socket);
        return 1;
    }

【问题讨论】:

  • 它跳过了这些行,因为它们没有转换成任何命令。

标签: c++ sockets winsock2


【解决方案1】:

我找到了答案!问题是我没有在程序中的任何地方调用 WSAStartup。开头的以下代码修复了它:

WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
    {
        return 1; 
    }

我通过从 WSAGetLastError() 获取错误号并在 msdn 上查找它发现了这一点。

【讨论】:

    【解决方案2】:

    尝试将SOCK_DGRAM 更改为SOCK_STREAM

    根据 MSDN,

    SOCK_STREAM - 一种套接字类型,它提供具有 OOB 数据传输机制的有序、可靠、双向、基于连接的字节流。此套接字类型使用 Internet 地址系列(AF_INET 或 AF_INET6)的传输控制协议 (TCP)。

    SOCK_DGRAM - 一种支持数据报的套接字类型,数据报是无连接的、不可靠的缓冲区,最大长度固定(通常很小)。此套接字类型使用 Internet 地址系列(AF_INET 或 AF_INET6)的用户数据报协议 (UDP)。

    就港口而言......

    local_address.sin_port 设置为 19992,但应该是 6222?

    htons 将主机字节顺序中的端口号转换为网络字节顺序(参见here

    【讨论】:

    • 好吧,关于 htons 是有道理的。我尝试了将 SOCK_DGRAM 更改为 SOCK_STREAM 的建议,但它仍然无法绑定。这是我的绑定代码: if(bind( receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR) { closesocket(receive_socket);返回 1; }
    • 另外,我必须使用 UDP,这就是 SOCK_DGRAM 的原因。
    • 啊。忘记那部分:)我看你还是想出来了。
    【解决方案3】:
    local_address.sin_port = htons(port);
    

    我觉得这很奇怪。另外,为什么使用 htons() 端口?这是没有意义的。难道你不能只使用 getaddrinfo() 或类似的东西,或者winsock需要手动填写信息吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多