У меня проблема с одним из моих домашних заданий по программированию сокетов в 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");