2013-09-18 8 views
0

Я знаю, что есть несколько похожих вопросов о SO, но я чувствую, что у всех есть другая проблема, которая вызывает это. Поэтому я отправляю свой конкретный случай.Недопустимый аргумент sendto в ansi C при попытке реализовать UDP

Я работаю над малиной pi, используя raspbian, производную debian. Я кодирования в ANSI C. Это сервер, который посылает некоторые данные в UdP клиента на другом конце через порт 500.

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <stdio.h> 
int main() 
{ 
    int sockfd; 
    struct sockaddr_in servaddr,cliaddr; 
    socklen_t clilen; 
    char buffer[256]; 

    sockfd=socket(AF_INET,SOCK_DGRAM,0); 

    bzero(&servaddr,sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY); 
    servaddr.sin_port=htons(500); 
    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 
    sprintf(buffer,"hi this is a test \n"); 
    if(sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr *)&cliaddr,sizeof(cliaddr))==-1) 
    { error("fail:") 
    }; 

    return 0; 
} 

Но это просто дает мне ошибку «неверный аргумент», я не могу выяснить, что может быть неправильным. Если тип аргумента, который я передаю sendto, неверен, это не сработает при компиляции. Но тип правильный, и это компилируется, только во время выполнения он терпит неудачу.

+0

Это не связано с типом аргументов. Например, 'sockfd' может быть любым целым числом, даже если это целое число не относится к сокету. Таким образом, ваш код будет скомпилирован, но вы получите ошибку во время выполнения. –

ответ

2

У вас нет инициализации для структуры cliaddr. Таким образом, его содержимое является случайным. Ваш код компилируется отлично, потому что у вас есть struct sockaddr_in, где он должен быть, но компилятор не может проверить, правильно ли вы его инициализировали.

С другой стороны, во время выполнения, когда sendto вынесено glibc или ядро ​​обнаруживает, что что случайные данные в cliaddr структуре не похож на действительный адрес и подбрасывает в invalid argument ошибку.

Решение: инициализировать переменную cliaddr перед ее использованием.

Редактирование: вам также необходимо правильно инициализировать сокет, третий аргумент не должен быть 0.

Second edit, прочитал меня: Для ресурсов рекомендую the extraordinary guide of Beej. Для вашей точной проблемы может помочь подзаголовок this.

+0

Как инициализировать структуру cliaddr? Я пытаюсь найти хороший пример кода, и кажется, что нынешний человек полностью сбил меня с пути. – mugetsu

+0

См. Ссылки во втором редактировании. Это хороший учебник, и у вас даже есть примеры. –

Смежные вопросы