С сокет может общаться с клиентом, но не может извлечь IP-адрес клиента, используя recvfrom
Программирование сокетов с использованием C. Код работает на стороне сервера. Код функционален, может общаться с 127.0.0.1 (localhost) и другими машинами. Но не удается извлечь клиентские IPv4-адрес и номер порта после вызова recvfrom(). Я думаю, что связь хорошая, значит, recvfrom успешно записывает адрес клиента в clientAddr, но по какой-то причине я не могу их распечатать. Функция getpeername() работает, но я просто хочу знать, почему я не могу получить правильный адрес и номер порта после вызова recvfrom().
Код выполняется с использованием флага -ggdb -Wall -std=c11. Нет предупреждения Работает на Ubuntu 18.04LTS. Ниже приведен код, который я считаю актуальным.
#include <arpa/inet.h> // To use inet_ntoa
#define ADDR_LEN sizeof(struct sockaddr)
#define MAX_DATA_SIZE 1024
Some code for accept connection and select the right file descirptor as
commSockFd.
char data[MAX_DATA_SIZE];
struct sockaddr_in clientAddr;
socklen_t clientAddrLen = ADDR_LEN;
printf("clientAddrLen before recvfrom() %d\n", clientAddrLen);
int sentRecvBytes = recvfrom(commSockFd, data, sizeof(data), 0,
(struct sockaddr*)&clientAddr, (&clientAddrLen));
printf("clientAddrLen after recvfrom() %d\n", clientAddrLen);
printf("Server received %d bytes from client %s:%u\n",sentRecvBytes,
inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
struct sockaddr_in peerAddr;
socklen_t peerLen = ADDR_LEN;
getpeername(commSockFd, (struct sockaddr*)&peerAddr,&peerLen);
printf("Result of getpeername, ip and port: %s %hu\n",
inet_ntoa(peerAddr.sin_addr), ntohs(peerAddr.sin_port));
Приведенный выше код распечатывается в виде:
Connection accepted from client: 192.168.70.112:4903
Blocked on select system call...
clientAddrLen before recvfrom() 16
clientAddrLen after recvfrom() 0
Server received 8 bytes from client 254.127.0.0:47010
Result of getpeername, ip and port: 192.168.70.112 4903
Странные вещи: 1. clientAddrLen устанавливается в 0 после recvfrom, где, согласно документации, я думаю, что это должно быть 8 или что-то еще. По крайней мере, какое-то положительное число. 2. После вызова recvfrom() он не может распечатать IP-адрес клиента и номер порта из clientAddr, что является основной проблемой. Однако, используя getpeername, я могу получить правильный результат.
Заранее благодарю за любую помощь!