如何创建在C UDP服务器? [英] How to create a UDP server in C?

查看:330
本文介绍了如何创建在C UDP服务器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用C编写一个UDP服务器(Linux下)。我知道,在插座()的功能,我必须使用 SOCK_DGRAM ,而不是 SOCK_STREAM

  IF((list_s =插座(AF_INET,SOCK_DGRAM,IPPROTO_UDP))小于0)
{
    fprintf中(标准错误,ERROR);
}

但现在,当我尝试运行程序(汇编没有错误),它说,没有在错误听()。这里是调用它:

 如果(听(list_s,5)℃下)
{
    fprintf中(标准错误,ERROR监听);
    出口(EXIT_FAILURE);
}

你能弄清楚的问题是什么?这是code:

  INT list_s; / *监听套接字* /
INT conn_s; / *连接插座* /
短整型口; / *端口号* /
结构SOCKADDR_IN servaddr; / *套接字地址结构* /如果((list_s =插座(AF_INET,SOCK_DGRAM,IPPROTO_UDP))小于0)
{
    fprintf中(标准错误,错误。\\ n);
}memset的(安培; servaddr,0,sizeof的(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(端口);如果(绑定(list_s,(结构sockaddr *)及servaddr,sizeof的(servaddr))小于0)
{
    fprintf中(标准错误,错误BIND \\ n);
}如果(听(list_s,5)℃的)// AL POSTO DI 5 LISTENQ
{
    fprintf中(标准错误,错误LISTEN \\ n);
    出口(EXIT_FAILURE);
}


解决方案

您不能数据报套接字,它根本就没有为它定义。你只需要绑定并开始阅读在一个循环中。

作为一个简短的说明,通知,它应该期望OS的连接的那个插座上,并且你会接受他们在稍后的时间。显然,这是没有意义的数据报套接字,从而错误。


旁注:你应该尝试使用 PERROR 打印这样的错误。在这种情况下,将(可能)曾经说过的不支持操作

I'm trying to write a UDP server in C (under Linux). I know that in the socket() function I must use SOCK_DGRAM and not SOCK_STREAM.

if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) 
{
    fprintf(stderr, "ERROR");
}

But now, when I try to run the program (no errors in compiling), it says that there is an error in listen(). Here is the call to it:

if (listen(list_s, 5) < 0)
{
    fprintf(stderr, "ERROR IN LISTEN");
    exit(EXIT_FAILURE);
}

Can you figure out what the problem is? This is the code:

int       list_s;                /*  listening socket          */
int       conn_s;                /*  connection socket         */
short int port;                  /*  port number               */
struct    sockaddr_in servaddr;  /*  socket address structure  */

if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) 
{
    fprintf(stderr, "ERROR\n");
}

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family      = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port        = htons(port);

if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 )
{
    fprintf(stderr, "ERROR IN BIND \n");
}

if ( listen(list_s, 5) < 0 )      // AL POSTO DI 5 LISTENQ
{
    fprintf(stderr, "ERROR IN LISTEN\n");
    exit(EXIT_FAILURE);
}

解决方案

You can't listen on a datagram socket, it's simply not defined for it. You only need to bind and start reading in a loop.

As a short explanation, listen informs the OS that it should expect connections on that socket, and that you're going to accept them at a later time. Obviously that doesn't make sense for datagram sockets, thus the error.


Side note: you should try to use perror to print such errors. In this case it would (likely) have said Operation not supported.

这篇关于如何创建在C UDP服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆