我有一个最奇怪的问题让我头疼。考虑以下代码:
// 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‘行中放了一个断点。当我步入上述代码的每一行时,调试光标直接从“unsigned short port”行跳到第一个“local_address.sin”行,即使我使用的是step into (F11),它也不会停在结构、整数、字符或套接字行,而是直接跳过它们。
此时,我将鼠标悬停在local_address、from_address、result、buffer和receive_socket上。它们都是乱七八糟的废话。这是因为我还没有定义这些变量吗?我还注意到,当我到达上面代码的底部时,local_address.sin_port被设置为19992,但它应该是6222?
编辑:下面是我的绑定代码,因为if语句为true,所以绑定代码失败:
if(bind( receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR)
{
closesocket(receive_socket);
return 1;
}发布于 2010-03-21 09:29:24
我想出了答案!问题是我没有在程序中的任何地方调用WSAStartup。下面开头的代码修复了这个问题:
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}我是通过从WSAGetLastError()获取错误号并在msdn上查找来发现这一点的。
发布于 2010-03-21 09:00:20
尝试将SOCK_DGRAM更改为SOCK_STREAM
根据MSDN的说法,
SOCK_STREAM -一种套接字类型,提供具有面向对象数据传输机制的顺序、可靠、双向、基于连接的字节流。此套接字类型对互联网地址族(AF_INET或AF_INET6)使用传输控制协议。
SOCK_DGRAM -支持数据报的套接字类型,数据报是固定(通常较小)最大长度的无连接、不可靠的缓冲区。此套接字类型对互联网地址族(AF_INET或AF_INET6)使用用户数据报协议。
至于港口..。
local_address.sin_port设置为19992,但应为6222?
htons将主机字节顺序的端口号转换为网络字节顺序(请参见here
发布于 2010-03-21 09:01:39
local_address.sin_port = htons(port);我觉得这很奇怪。另外,为什么在端口上使用htons()?这没有任何意义。你不能直接使用getaddrinfo()或者类似的东西吗,或者winsock需要手动填写信息吗?
https://stackoverflow.com/questions/2485387
复制相似问题