UDP server компилируется но не запускается

написал вот такой сервер

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

#define DEFPORT 5000
#define DEFNUM  3

typedef struct options {
    int port;
    int number;
} info_t;

/*
 * ip port
 * number of connection for work
 */
static int server(int port, int nmax)
{
        int sock;
        struct sockaddr_in server;
        int mysock;
        char buff[1024];
        int rval;
    int n = 0;
    memset(&server,0 , sizeof(server));

        /* Create socket */

        sock = socket (AF_INET, SOCK_DGRAM, 0);
        if (sock < 0) {
                perror("create socet failure");
        return -1;
        }

        server.sin_family = AF_INET;
        server.sin_addr.s_addr = htonl (INADDR_ANY);
        server.sin_port = htons(port);

        /* Call bind */

        if (bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("bind failed");
        return -1;
        }
        /*listen*/

        listen(sock, 5);

        /* Accept */

        while (n < nmax) {
                mysock = accept(sock, (struct sockaddr *) 0, 0);
                if (mysock == -1) {
                        perror("accept failed");
                } else {
                        memset(buff, 0, sizeof(buff));
                        if ((rval = recv(mysock, buff, sizeof(buff), 0)) < 0) {
                                perror("reading stream message error");
            } else if (rval == 0) {
                                printf("Ending connection\n");
            } else {
                                printf("MSG: %s\n",buff);
                            printf("Got message (rval = %d)\n", rval);
                n++;
            }
                        close(mysock);
                }
    }
        return 0;
}

static void parse_args(int argc, char *argv[], info_t *info)
{
    int rez = 0;
    int p = info->port, n = info->number;

    while ((rez = getopt(argc, argv, "p:n:h")) != -1) {
        switch (rez) {
            case 'p': 
                p = atoi(optarg);
                if (p <= 0 || p >= 65535) p = DEFPORT;
                printf("%d\n",p);
                break;
            case 'n':
                n = atoi(optarg);
                if (n <= 0) n = DEFNUM;
                break;
            case 'h':
                printf("\nUsage:\n\t-p PORT; -n NUMBER\n\n");
                exit(0);
            default:
                break;
        }
    }

    info->port = p;
    info->number = n;
}

int main (int argc, char *argv[]) 
{
    info_t info = {
        .port = DEFPORT,
        .number = DEFNUM
    };

    parse_args(argc, argv, &info);
    server(info.port, info.number);

    return 0;
}

Собирается но при запуске : accept failed: Operation not supported введите сюда описание изображения Подскажите в чем проблема.


Ответы (2 шт):

Автор решения: KoVadim

Проблема в этой строке

mysock = accept(sock, (struct sockaddr *) 0, 0);

вы говорите "сделай accept", а результат положи по нулевому адресу и что бы размер у него был нулевой. Система Вам и отвечает - не могу.

Фишка в том, что размер структуры (там где третий параметр равный нулю) это такой признак, который используется для понимания функцией, с какой именно структурой она работает. Такая себе плюсовая перегрузка.

Но проблема ещё глубже. accept как бы не очень применим к UDP протоколу. В нем нет установки соединения, а значит и не нужен такой вызов. связанный вопрос

И если проверить, что возвращает listen, то вдруг окажется, что это также "Operation not supported" - так как даже эта операция не очень то и применима.

Если же хотите пример кода для работы с UDP сокетом - вот http://web.cs.wpi.edu/~claypool/courses/525-S01/projects/proj2/listen-udp.c

→ Ссылка
Автор решения: gbg

Проблема в том, что UDP не требует accept вовсе. accept - это про сокеты с соединением, например, про TCP.

Откройте нормальный учебник по TCP/IP типа Снейдера, там точно рабочий пример. UDP в учебнике тоже есть.

введите сюда описание изображения

→ Ссылка