0

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

// 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;
    }
4

3 回答 3

1

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

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

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

于 2010-03-21T01:29:23.630 回答
0

尝试更改SOCK_DGRAMSOCK_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将主机字节顺序中的端口号转换为网络字节顺序(请参见此处

于 2010-03-21T01:00:19.643 回答
0
local_address.sin_port = htons(port);

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

于 2010-03-21T01:01:38.503 回答