【问题标题】:UDP client/server send data but can't readUDP 客户端/服务器发送数据但无法读取
【发布时间】:2015-12-26 16:54:14
【问题描述】:

我正在尝试通过 LAN 将数据从一个应用程序发送到另一个应用程序,我可以发送数据(sendto 返回预期的字节数)但我无法读取数据。我知道这是因为我使用 select 来测试读取操作并且它返回 false。以下是用于创建客户端和服务器的代码:

创建套接字

sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

绑定到端口:

addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;

bind(sock_fd, (struct sockaddr*)&addr, sizeof(sockaddr));

将数据发送到我使用的另一台机器:

o_addr.sin_family = family;
o_addr.sin_port = port;
o_addr.sin_addr.s_addr = inet_addr("other_side_ip_address_here");
uint32 sent;    

sent = sendto(sock_fd, data, length, 0, (struct sockaddr*)&o_addr, sizeof(struct sockaddr))

从我使用的另一台机器读取数据:

struct sockaddr_in o_addr;
uint32 read;
int l = sizeof(struct sockaddr);
read = recvfrom(sock_fd, data, length, 0, (struct sockaddr*)&o_addr, &l)

并测试是否有一些数据可以读取我使用:

int r;
struct timeval tv = { 0, 0 };
fd_set fds;

FD_ZERO(&fds);
FD_SET(sock, &fds);

r = select(sock + 1, &fds, NULL, NULL, &tv);

if (FD_ISSET(sock, &fds))
    return true;
return false;

套接字处于块模式,正在两台机器上执行测试。 感谢关注

【问题讨论】:

  • addr.sin_port = htons(port); ... o_addr.sin_port = 端口;希望在两个端口上都使用 htons() 吗?
  • 好的,感谢您的帮助
  • 你不必明确声明一个类型是像struct sockaddr_in addr;这样的结构,就像你也不写class string s = "abc";一样。
  • select 与阻塞套接字结合使用通常没有意义。通常您使用select 的原因是您不想阻止。但是使用阻塞套接字,您无法避免它。所以你的设计有问题。
  • 大卫,我总是使用 select,我认为它在两种情况下都非常有用,无论是否阻塞,我可以测试是否有东西可以读取,只需调用一个方法!这不是很棒吗?

标签: c++ sockets winsock


【解决方案1】:

我的猜测是接收套接字上的bind 调用由于某种原因失败。尝试添加一些错误检查。

【讨论】:

  • 对我的问题的第一条评论给了我错误,我在发送消息之前没有调用 htons,所以它正在向未知端口发送消息。还是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多