首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在winsock2中使用C++创建套接字时出现问题

问在winsock2中使用C++创建套接字时出现问题
EN

Stack Overflow用户
提问于 2010-03-21 08:53:45
回答 3查看 1.8K关注 0票数 0

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

代码语言:javascript
复制
// 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,所以绑定代码失败:

代码语言:javascript
复制
if(bind( receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR) 
    {
        closesocket(receive_socket);
        return 1;
    }
EN

回答 3

Stack Overflow用户

发布于 2010-03-21 09:29:24

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

代码语言:javascript
复制
WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
    {
        return 1; 
    }

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

票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2010-03-21 09:01:39

代码语言:javascript
复制
local_address.sin_port = htons(port);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2485387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档