问题描述
不使用线程thread可以正常接受报文,加了后就在recvfrom那里不动了,是怎么回事?using namespace std;#include <thread>#include <iostream>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <unistd.h>#include <arpa/inet.h>void netlist(){int sockSrv = socket (AF_INET, SOCK_DGRAM, 0);sockaddr_in addrSrv,addrClient; addrSrv.sin_addr.s_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(1986); bind(sockSrv, (sockaddr *)&addrSrv,sizeof(sockaddr)); socklen_t len=sizeof(sockaddr); char recvBuf[100]; recvfrom(sockSrv,recvBuf,100,0,(sockaddr*)&addrClient,&len); cout<<recvBuf<<endl; //closesocket(sockSrv);}int main(){thread t(netlist);t.join();return 0;} 问题补充:牟盖东 写道
解决方案
UDP好象也没RST, 不好意思, TCP搞多了. tcpdump可以查UDP发包的情况
解决方案二:
刚学socket和thread就上C++11,太超前了.果断pthread_create()吧.
解决方案三:
貌似很奇葩,楼主你敢把JAVA client端的socket.close(); 注释掉吗?有可能还没发出去就被关掉了.发了RST.还不行就只能上tcpdump了.
解决方案四:
楼主你敢listen一下,你敢吗?
解决方案五:
那你在线程netlist 里加上listen试试嘛. 就算可以收包,你那个程序进来了,阻塞在recvfrom也是因为没有别人发UDP包给它.
解决方案六:
看到你的UPD服务器端代码,先BIND了,后面没有listen.如果你是客户端代码,又没有先SENDTO
解决方案七:
敢问楼主用的是什么编译器,什么库?从来没看见过thread标准库头文件,难道是boost?