【问题标题】:C Sendto doesn't work when doing it repeatedlyC Sendto 重复执行时不起作用
【发布时间】:2019-11-13 00:30:19
【问题描述】:

在 C 中使用 sendto() 时遇到一个奇怪的问题。我有以下代码:

struct sockaddr_in currSocket;
int currSocketLength = sizeof(currSocket);
memset((char *)&currSocket, 0, sizeof(currSocket));
currSocket.sin_family = AF_INET;
currSocket.sin_port = htons(serverPortNumber);
// add the server IP address
inet_aton(serverIP, &currSocket.sin_addr);

int send_result = sendto(masterSocket, bufferToSend , 1000, 0, (struct sockaddr *) &currSocket, currSocketLength);
if (send_result < 0) {
    perror("Something is wrong");
}
bzero(bufferToSend, 1000);

当我第一次在bufferToSend 中发送数据时,这非常有用。但是,如果我想以完全相同的方式再次发送数据(按照上面的代码 - 创建套接字并将其发送到那里),它不会被接收到。为什么会这样,我该如何解决?

编辑: 在进一步研究之后,我意识到这是因为我的 IP 地址字符串是错误的,因为它被覆盖了。在我进行先前的阅读之后,它的价值似乎发生了变化。

// here the IP address is fine
printf("%s\n", ipAddress);
char bufferFromSocket[512];
int amount_read = read(masterSocket, bufferFromSocket, 512);
// here the IP address is overwritten by whatever is in bufferFromSocket
printf("%s\n", ipAddress);

任何想法为什么会发生这种情况?

【问题讨论】:

  • 您能否描述一下您是如何验证数据发送失败的,而不是接收方的问题?
  • 上面的程序应该是一个处理多个请求的隧道。每次进来时,我都会创建一个 currSocket(如上所示)并将其发送到适当的位置。我在没有隧道的情况下测试了接收器应用程序,它能够接收消息,所以我知道它是这样工作的。
  • 建议您获取 Wireshark 的副本,看看实际线路上发生了什么。这会让你知道问题出在那个代码上还是在接收器上。
  • 我复制粘贴了这段代码,没有修改,在它周围添加了大约 20 行以使其编译和运行,并且多次成功发送数据。请花点时间将您的 sn-p 转为 MCVE,以便确保您包含所有相关信息。
  • 嗯,好吧,也许这是我代码的其他部分。我会调查的。谢谢@thatotherguy

标签: c linux sockets


【解决方案1】:

我没有为 ipAddress 分配足够的空间。将它作为指针,当它应该是 char[] 时,我使用 strcpy 复制到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2017-08-15
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多