Recvfrom () продолжает возвращать неправильное значение - PullRequest
0 голосов
/ 26 марта 2020

Я вызываю udpclient в main, где я передаю «это тест» в качестве сообщения параметра.

#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, поэтому, когда я пишу (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 () должен возвращать длину сообщения, если я не ошибаюсь, я не знаю, где я делаю неправильно! Помощь!

1 Ответ

1 голос
/ 26 марта 2020
n = sendto(socketfd, message, sizeof(message), 0, (const struct sockaddr *) &targetaddress, sizeof(targetaddress));

Поскольку message является char *, sizeof(message) дает количество байтов, которое char * занимает на вашей платформе. По-видимому, это 8 байтов, поэтому вы отправили 8-байтовое сообщение.

...