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 шт):
Проблема в этой строке
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
Проблема в том, что UDP не требует accept вовсе. accept - это про сокеты с соединением, например, про TCP.
Откройте нормальный учебник по TCP/IP типа Снейдера, там точно рабочий пример. UDP в учебнике тоже есть.
