【问题标题】:Recvfrom() keeps returning wrong valueRecvfrom() 不断返回错误值
【发布时间】:2020-03-26 16:32:27
【问题描述】:

我在 main 中调用 udpclient,我将“这是一个测试”作为参数消息传递。

#define MAX_BUFFER 128


void udpclient(char *message, char *target_ip, int target_port){

///* address of server we trying to reach */
struct sockaddr_in targetaddress;
/* buffer to receive echo */
char buffer[MAX_BUFFER];

/* create socket */
int socketfd;
socketfd = socket(AF_INET, SOCK_DGRAM, 0);
if(socketfd == -1)
    socketerror();

/* target server informations */
memset(&targetaddress, 0, sizeof(targetaddress));
targetaddress.sin_family = AF_INET;
targetaddress.sin_port   = htons(target_port);
targetaddress.sin_addr.s_addr = inet_addr(target_ip);

在我向服务器发送消息后,服务器必须回复“echo:这是一个测试”,但 recvfrom() 出于某种原因返回 n = 8,所以当我执行 write(1, buffer, n) 时,它会截断缓冲。

/* send message to targetaddress */
ssize_t n;
n = sendto(socketfd, message, sizeof(message), 0, (const struct sockaddr *) &targetaddress, sizeof(targetaddress));
if(n == -1)
    udpsenderror();

printf("%i\n", n);

socklen_t addrlen;
addrlen = sizeof(targetaddress);
/* receive echo from targetaddress */
n = recvfrom(socketfd, buffer, MAX_BUFFER, 0, (struct sockaddr *) &targetaddress, &addrlen);
if(n == -1)
    udpechoerror();

printf("%i\n", n);
write(1, "echo: ", 6);
write(1, buffer, n);

return;

}

如果我没记错的话,Recvfrom() 应该返回消息的长度,我不知道我在哪里做错了!救命!?

【问题讨论】:

  • 来自recvfrom man page接收调用通常会返回任何可用的数据,直到请求的金额,而不是等待收到请求的全部金额。.
  • 鉴于char *message,您认为sizeof(message) 会返回什么?
  • Andrew Henle 我认为错误出在哪里!去确认一下
  • 非常感谢,就是这样!!保持安全,待在家里

标签: c sockets networking udp


【解决方案1】:
n = sendto(socketfd, message, sizeof(message), 0, (const struct sockaddr *) &targetaddress, sizeof(targetaddress));

由于messagechar *sizeof(message) 给出了char * 在您的平台上占用的字节数。显然,那是 8 个字节,所以你发送了一个 8 个字节的消息。

【讨论】:

  • 你完全正确!谢谢你的解释保持安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2019-05-22
  • 2018-02-07
  • 2021-07-17
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多