在winsock2中使用C ++创建套接字时遇到问题

时间:2010-03-21 00:53:45

标签: c++ sockets winsock2

我遇到了最令人头疼的问题。请考虑以下代码:

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

3 个答案:

答案 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需要手动填写信息?