2016-11-01 2 views
0

스레드를 사용하여 배경에 UDP 서버를 시작하고 싶습니다. 그러나 서버가 패킷을 수신하면 영원히 시작하고 루프를 시작합니다. TCP 서버를 대신 사용하면 동일한 스레드가 제대로 작동합니다. 당신은 여기에서 심각한 문제가C 스레드를 사용하는 백 그라운드에서 UDP 서버

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); 
} 
+0

당신은 알고있다 UDP는 * 연결되지 않은 프로토콜입니까? TCP에서하는 것처럼 연결을 수락하지 않고 대신 데이터 그램을받습니다. –

+1

당신은'local' 소켓 주소를위한 포인터를 사용하지 않는다는 많은 문제를 해결할 수 있습니다. –

+0

정확하게하고 싶은 것을 설명해 주시겠습니까? 당신은 특별히 데이터 그램을 기다리는 루프를 만드는 코드를 작성했습니다. 그게 네가 원하는게 아니야 .. 너 뭘 원하는거야? –

답변

2

:

테스트 코드는 다음과

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)