C UDP服务器在后台使用线程

C UDP服务器在后台使用线程,c,server,udp,C,Server,Udp,使用线程,我想在后台启动UDP服务器。 但是服务器启动并循环检查是否收到任何数据包。 如果改用TCP服务器,同样的线程也可以正常工作 测试代码如下所示: int udp_server_listen () { printf("udp_server_listen \n"); int res; unsigned char rsp_buf[1024]; struct sockaddr_in src; socklen_t srclen; memset

使用线程,我想在后台启动UDP服务器。 但是服务器启动并循环检查是否收到任何数据包。 如果改用TCP服务器,同样的线程也可以正常工作

测试代码如下所示:

int udp_server_listen () {
    printf("udp_server_listen \n");
    int res;    
    unsigned char rsp_buf[1024];
    struct sockaddr_in src;
    socklen_t srclen;
    memset(&src, 0, sizeof(src));
    srclen = sizeof(src);

    listen(s , 3);

    //Accept and incoming connection
    int c = sizeof(struct sockaddr_in);
    int client_sock;
    while( (client_sock = accept(s, (struct sockaddr *)&src, (socklen_t*)&c)) )
    {
        sleep(1);
        printf("OK \n");
    }
}

void *thread_udp_cr_listen (void *v)
{
    udp_server_listen();
    return NULL;
}

int  s;
int main()
{
    printf("start test \n");

    struct sockaddr_in *local = malloc(sizeof (struct sockaddr_in *));      
    s = socket(AF_INET, SOCK_DGRAM, 0); // UDP
    printf("create socket end\n");
    int reusaddr = 1;
    int reusport = 1;
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0)
    {
        printf("setsockopt(SO_REUSEADDR) failed \n");
    }
    if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reusport, sizeof(int)) < 0)
    {
        printf("setsockopt(SO_REUSEPORT) failed \n");
    }
    struct timeval tv;
    tv.tv_sec = 2;  /* 30 Secs Timeout */
    tv.tv_usec = 0;  // Not init'ing this can cause strange errors
    setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
    fcntl(s, F_SETFL, O_NONBLOCK);
    printf(" Bind to a specific network interface and a specific local port\n");
    int i = 0;
    for(;i<6;i++)
    {
            if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0)
            {
                printf("bind Faild %d\n", i);
                sleep(1);
                continue;
            }
        break;
    }       
    error = pthread_create(&udp_cr_server_thread, NULL, &thread_udp_cr_listen, NULL);
    if (error<0)
    {
        printf("thread error \n");
    }
    pthread_join(udp_cr_server_thread, NULL);   
}
intudp\u服务器\u侦听(){
printf(“udp_服务器_侦听\n”);
国际关系;
无符号字符rsp_buf[1024];
src中的结构sockaddr_;
socklen_t srclen;
memset(&src,0,sizeof(src));
srclen=sizeof(src);
听(s,3);
//接受和传入连接
int c=sizeof(结构sockaddr_in);
int客户端_sock;
而((client_sock=accept(s,(struct sockaddr*)和src,(socklen_t*)和c)))
{
睡眠(1);
printf(“OK\n”);
}
}
void*thread\u udp\u cr\u listen(void*v)
{
udp_服务器_侦听();
返回NULL;
}
int-s;
int main()
{
printf(“开始测试”);
struct sockaddr_in*local=malloc(sizeof(struct sockaddr_in*));
s=socket(AF_INET,SOCK_DGRAM,0);//UDP
printf(“创建套接字结束\n”);
int=1;
int端口=1;
if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&REUSEADDR,sizeof(int))<0)
{
printf(“setsockopt(SO_REUSEADDR)失败\n”);
}
if(setsockopt(s,SOL_SOCKET,SO_REUSEPORT,&reusport,sizeof(int))<0)
{
printf(“setsockopt(SO_REUSEPORT)失败\n”);
}
结构时间值电视;
tv.tv_sec=2;/*30秒超时*/
tv.tv_usec=0;//不初始化这可能会导致奇怪的错误
setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)和tv,sizeof(struct timeval));
fcntl(s、F_设置FL、O_非块);
printf(“绑定到特定网络接口和特定本地端口\n”);
int i=0;

对于(;i您有一个严重的问题:

struct sockaddr_in *local = malloc(sizeof (struct sockaddr_in *));      
因为您只是分配指针的大小,而不是结构本身的大小

这当然应该是:

struct sockaddr_in *local = malloc(sizeof (struct sockaddr_in));      

此行中同一变量还有两个问题:

        if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0)
if(bind(s,(struct sockaddr*)&local,sizeof(local))<0)
这应该是:

        if (bind(s, (struct sockaddr *)local, sizeof(*local)) < 0)
if(bind(s,(struct sockaddr*)local,sizeof(*local))<0)

您知道UDP是一种未连接的协议吗?您不接受TCP中的连接,而只是接收数据报。您可以解决的许多问题是您不使用
本地
套接字地址的指针。您能确切地解释一下您想要做什么吗?您专门编写了循环等待dat的代码agrams.如果这不是你想要的..你想要什么?顺便说一句,我真的认为你的程序中不需要线程。你启动一个线程,然后立即等待它退出。如果你的主线程除了等待网络线程退出之外什么都不做,为什么要首先使用线程呢?另外,如果
bind
失败,那么就没有问题了再尝试也没有用。