【问题标题】:Why my socket doesn't receive any message?为什么我的套接字没有收到任何消息?
【发布时间】:2021-11-19 16:51:52
【问题描述】:

在我的代码中,我有这个 sn-p:

char temp_buff[2048] = "";
strcpy(temp_buff, json_object_to_json_string(hb));
printf("%s\n", temp_buff);

char *str;
int fd = 0;
struct sockaddr_in demoserverAddr, cliaddr;
fd = socket(AF_INET, SOCK_STREAM, 0);

if (fd < 0)
{
    debug_level > 0 && printf("[SKT]\tError creating socket\n");
}
else
{
    demoserverAddr.sin_family = AF_INET;
    demoserverAddr.sin_port = htons(9100);
    demoserverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    memset(demoserverAddr.sin_zero, '\0', sizeof(demoserverAddr.sin_zero));
}
    memset(&cliaddr, 0, sizeof(cliaddr));

int len=sizeof(cliaddr);
sendto(fd, temp_buff, strlen(temp_buff),MSG_CONFIRM, (const struct sockaddr *)&cliaddr, len);

另一方面,我在终端中写netcat -u -l 9100 以查看传入的消息,但没有任何反应。为什么?

【问题讨论】:

  • 尝试SOCK_DGRAM 用于UDP 而不是SOCK_STREAM
  • 同样的事情,还是谢谢你
  • 检查sendto 的返回值是否有错误。否则,请发布Minimal, Reproducible Example 供我们测试。
  • 错误-1:无效参数
  • 你不应该在sendto调用中使用demoserverAddr而不是cliaddr吗?

标签: c sockets udp client


【解决方案1】:

这里有两个问题。

首先,通过在对socket 的调用中使用SOCK_STREAM,您正在创建一个TCP 套接字,但是您正在使用sendto,并且您的netcat 调用正在使用-u 选项,表明您想要使用UDP。所以请改用SOCK_DGRAM

其次,您将cliaddr 指定为要发送到的地址,但该变量已被memset 清零。 demoserverAddr 变量包含远程服务器的 IP 和端口,因此将其传递给 sendto。另外,一定要检查返回值。

int len=sizeof(demoserverAddr);
int rval = sendto(fd, temp_buff, strlen(temp_buff),MSG_CONFIRM, 
                  (const struct sockaddr *)&demoserverAddr, len);
if (rval < 0) perror("sendto failed");

【讨论】:

  • sendto 失败:参数无效...为什么?
  • @ReportFeedback 您是否完全复制了上面的行?另外,在设置demoserverAddr 的任何字段之前尝试memset(demoserverAddr, '\0', sizeof(demoserverAddr));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多