Простое приложение для обмена сообщениями ... получение ошибки 14: неверный адрес - PullRequest
5 голосов
/ 30 ноября 2011

Я пишу простое приложение для обмена сообщениями на C, используя сокеты. Когда я использую функцию recvfrom, она возвращает -1 и устанавливает errno = 14, равное Bad address (которое я печатаю в конце).

Странно то, что он все еще читает из сокета и получает правильное сообщение. То есть приложение работает отлично и, как и ожидалось, за исключением этой ошибки.

Мой вопрос таков: почему вы думаете, что я получаю эту ошибку? Я не могу думать ни о какой причине. Я использовал inet_pton для установки peer->sin_addr, но я получал ту же ошибку.

// socket file descriptor to send data through
int recv_sock_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

// fill in the peer's address, loopback in this case
struct sockaddr_in *peer = malloc(sizeof(struct sockaddr_in));
peer->sin_family = AF_INET;
peer->sin_port   = htons(11110);
char *new = &(peer->sin_addr);
new[0] = 127;
new[1] = 0;
new[2] = 0;
new[3] = 1;
for (int i = 0; i < 8; i++) {
    peer->sin_zero[i] = NULL;
}

bind(recv_sock_fd, peer, sizeof(struct sockaddr_in)); 

// check to see if the socket has any data...code removed

char buff[32] = {0};
errno = 0;
int bytes_received = recvfrom(recv_sock_fd, buff, sizeof(buff), NULL, (struct sockaddr *)peer, sizeof(struct sockaddr_in));

printf("Bytes recieved: %d: %d : %s\n", bytes_received, errno, strerror(errno));

1 Ответ

7 голосов
/ 30 ноября 2011

Посмотрите на подпись recvfrom(2):

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

Последним аргументом является адрес , а вы даете ему простое целое число.

Тогда вы неправильно строите IP-адрес. Используйте inet_pton(3), вот для чего это. Также проверьте возвращаемое значение bind(2), сейчас оно точно не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...