【发布时间】: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