我遇到了最令人头疼的问题。请考虑以下代码:
// 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),它也不会停在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;
}
答案 0 :(得分:1)
我想出了答案!问题是我没有在我的程序中的任何地方调用WSAStartup。下面的代码在开头修复它:
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}
我通过从WSAGetLastError()获取错误编号并在msdn上查找它来发现这一点。
答案 1 :(得分:0)
尝试将SOCK_DGRAM
更改为SOCK_STREAM
根据MSDN,
SOCK_STREAM - 一种套接字类型,提供带有OOB数据传输机制的顺序,可靠,双向,基于连接的字节流。此套接字类型使用传输控制协议(TCP)作为Internet地址系列(AF_INET或AF_INET6)。
SOCK_DGRAM - 支持数据报的套接字类型,它是固定(通常很小)最大长度的无连接,不可靠的缓冲区。此套接字类型使用用户数据报协议(UDP)作为Internet地址系列(AF_INET或AF_INET6)。
就港口而言......
local_address.sin_port设置为19992,但它应该是6222?
htons
将主机字节顺序的端口号转换为网络字节顺序(参见here)
答案 2 :(得分:0)
local_address.sin_port = htons(port);
我发现这很奇怪。另外,为什么htons()端口?这是没有意义的。难道你不能只使用getaddrinfo()或类似的东西,还是winsock需要手动填写信息?