在使用螺纹的背景的C UDP服务器

时间:2016-11-01 09:00:04

标签: 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(&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);   
}

1 个答案:

答案 0 :(得分:2)

你有一个严重的问题:

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)

这应该是:

{{1}}