C UDP服务器在后台使用线程
使用线程,我想在后台启动UDP服务器。 但是服务器启动并循环检查是否收到任何数据包。 如果改用TCP服务器,同样的线程也可以正常工作 测试代码如下所示: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
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
失败,那么就没有问题了再尝试也没有用。