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

问题描述 投票:0回答:1

使用线程,我想在后台启动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);   
}
c server udp
1个回答
2
投票

你有一个严重的问题:

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

因为你只是分配指针的大小而不是结构本身的大小。

这当然应该是:

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


Two more problems with the same variable in this line:
        if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0)

这应该是:

        if (bind(s, (struct sockaddr *)local, sizeof(*local)) < 0)
© www.soinside.com 2019 - 2024. All rights reserved.