似乎无法将客户端地址保存到 sourceMsgs[j]
Can't seem to save the client's address to sourceMsgs[j]
标题说明了一切,这可能是一件简单的事情,但我在编程方面还很陌生,所以提出了这个愚蠢的问题..
我有:
printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
查看保存在 sourceMsgs[j] 中的 IP 地址是否正确,所以我假设问题出在:
nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i],sizeof(sourceMsgs));
// (uk: save the coordinates/address of the source of the received message
// in table sourceMsgs at index nReceivedMessages).
//I'm pretty sure what I did here is wrong
int j = nReceivedMessages;
sourceMsgs[j].sin_addr = cli_addr.sin_addr;
printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
nReceivedMessages++;
total += receivedValue;
printf("<Servidor> Valor recebido: %f\n", receivedValue);
//(uk: <Server> Received value)
if(nReceivedMessages == 1){
timeout = 1;
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(DWORD));
}
}
}
sprintf(response, "Received Messages: %f Total: %f", nReceivedMessages, total);
int reslen = sizeof(response);
for(i=0; i<nReceivedMessages; i++){
// (uk: transmit the content of variable response, the previously defined string, to
// all the destinations in table sourceMsgs).
nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i],sizeof(sourceMsgs));
如果 post 非常不完整,我深表歉意,但这是我的第一个。
预先感谢您的帮助
编辑:
看来问题确实在于传递结构的长度(WSAError 10014)。
现在的代码是这样的:
nbytes = sendto(s, response , strlen(response), 0 , (struct sockaddr *)&sourceMsgs[i].sin_addr, sizeof(sourceMsgs[i].sin_addr));
我不太确定该怎么做,但可能有不同的方法:
sourceMsgs[j].sin_addr = cli_addr.sin_addr;
printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
nReceivedMessages++;
total += receivedValue;
因为我认为我做的方式有点搞砸了。
sendto
的参数应该是指向 sockaddr
结构的指针,而不是包含它的结构。
nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i].sin_addr,sizeof(sourceMsgs[i].sin_addr));
传递结构的长度可能有问题。
nbytes = sendto(s, response, reslen, 0, (struct sockaddr *)&sourceMsgs[i], sizeof(sourceMsgs[i]));
// sizeof(sourceMsgs) gives - ( sizeof(sourceMsgs[1] or struct sockaddr_in) * (No. of messages in array) ).
此外,我注意到使用 setsockopt 设置接收超时时出现问题。有关说明,请参阅 SO_RCVTIMEO。
标题说明了一切,这可能是一件简单的事情,但我在编程方面还很陌生,所以提出了这个愚蠢的问题..
我有:
printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
查看保存在 sourceMsgs[j] 中的 IP 地址是否正确,所以我假设问题出在:
nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i],sizeof(sourceMsgs));
// (uk: save the coordinates/address of the source of the received message
// in table sourceMsgs at index nReceivedMessages).
//I'm pretty sure what I did here is wrong
int j = nReceivedMessages;
sourceMsgs[j].sin_addr = cli_addr.sin_addr;
printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
nReceivedMessages++;
total += receivedValue;
printf("<Servidor> Valor recebido: %f\n", receivedValue);
//(uk: <Server> Received value)
if(nReceivedMessages == 1){
timeout = 1;
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(DWORD));
}
}
}
sprintf(response, "Received Messages: %f Total: %f", nReceivedMessages, total);
int reslen = sizeof(response);
for(i=0; i<nReceivedMessages; i++){
// (uk: transmit the content of variable response, the previously defined string, to
// all the destinations in table sourceMsgs).
nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i],sizeof(sourceMsgs));
如果 post 非常不完整,我深表歉意,但这是我的第一个。 预先感谢您的帮助
编辑:
看来问题确实在于传递结构的长度(WSAError 10014)。 现在的代码是这样的:
nbytes = sendto(s, response , strlen(response), 0 , (struct sockaddr *)&sourceMsgs[i].sin_addr, sizeof(sourceMsgs[i].sin_addr));
我不太确定该怎么做,但可能有不同的方法:
sourceMsgs[j].sin_addr = cli_addr.sin_addr;
printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
nReceivedMessages++;
total += receivedValue;
因为我认为我做的方式有点搞砸了。
sendto
的参数应该是指向 sockaddr
结构的指针,而不是包含它的结构。
nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i].sin_addr,sizeof(sourceMsgs[i].sin_addr));
传递结构的长度可能有问题。
nbytes = sendto(s, response, reslen, 0, (struct sockaddr *)&sourceMsgs[i], sizeof(sourceMsgs[i]));
// sizeof(sourceMsgs) gives - ( sizeof(sourceMsgs[1] or struct sockaddr_in) * (No. of messages in array) ).
此外,我注意到使用 setsockopt 设置接收超时时出现问题。有关说明,请参阅 SO_RCVTIMEO。