C UDP-сокет не работает - PullRequest
       15

C UDP-сокет не работает

1 голос
/ 23 января 2012

У меня проблема с одним из моих домашних заданий по программированию сокетов в C .. мы делаем простую вещь клиент / сервер с UDP, и у меня проблемы с сервером ... вот фрагмент:

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[PACKET_DATA_LENGTH];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
    if (argc < 2) {
        fprintf(stderr,"ERROR, no port provided\n");
        exit(1);
    }
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");

Изначально sockfd = socket(AF_NET, SOCK_DGRAM, 0) был SOCK_STREAM, но поскольку спецификация проекта заключалась в том, чтобы сделать это в UDP, а не в TCP, я изменил STREAM на DGRAM.

Я называю сервер как: ./receiver 1234

И я получаю ошибку: ERROR on accept: Operation not supported on socket

Однако, если я верну его обратно с DGRAM на STREAM, он скомпилируется и ./receiver 1234 будет работать нормально.

Помощь

Спасибо! -kstruct

EDIT Вот как выглядит error () (это заранее заданный код, я его не писал, он был частью проекта)

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

EDIT2 Вот еще мой код (что следует сразу после первого блока кода, который я разместил) ... Я полагаю, что стандартный код вызывает функцию accept (), но разве это не должно вызывать другое выходное сообщение? А именно, не должно ли это сказать ERROR opening socket, а не ERROR on accept?

bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
      error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) 
    error("ERROR on accept");

Ответы [ 2 ]

6 голосов
/ 23 января 2012

UDP без установления соединения.Почему вы звоните accept?

0 голосов
/ 23 января 2012

accept(2) не имеет смысла для протокола дейтаграмм без установления соединения, такого как UDP. accept(2) только для протоколов SOCK_STREAM и SOCK_SEQPACKET.

Вы можете connect(2) протокол UDP, чтобы попросить ядро ​​обеспечить дополнительную фильтрацию, но это не всегда желательно.

...