当前位置:  技术问答>linux和unix

Linux下的recvfrom为什么一直阻塞

    来源: 互联网  发布时间:2016-11-11

    本文导语:  先贴代码 //Client SOCKET UDPSocket = socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in addr; memset(&addr, 0, sizeof(sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(5000); addr.sin_addr.s_addr = INADDR_ANY; bind(UDPSocket, (sockaddr*)&addr, sizeo...

先贴代码

//Client
SOCKET UDPSocket = socket(AF_INET, SOCK_DGRAM, 0);

sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(5000);
addr.sin_addr.s_addr = INADDR_ANY;
bind(UDPSocket, (sockaddr*)&addr, sizeof(addr));

char buf[1024*8] = {0};
INT len = recvfrom(UDPSocket, buf, 1024*8, 0, NULL, NULL);

//Server
SOCKET serverUDP = socket(AF_INET, SOCK_DGRAM, 0); 

sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = 5000;
server.sin_addr.s_addr = INADDR_ANY;

if (SOCKET_ERROR == bind(serverUDP, (sockaddr*)&server, sizeof(server)))
{
INT err = WSAGetLastError();
MessageBox("Error");
}

sockaddr_in clientAddr;
clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(5000);
         //clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");     //Windows上的本机IP
clientAddr.sin_addr.s_addr = inet_addr("192.168.203.128"); //192.168.203.128是我Linux虚拟机上的IP地址

if (SOCKET_ERROR == sendto(serverUDP, "Hello", 6, 0, (sockaddr*)&clientAddr, sizeof(clientAddr)))
{
MessageBox("Error");
}


这段代码在Windows上能够正常收发,但如果把Server在Windows上运行,Client在Linux上去收数据就收不到,程序会一直阻塞在recvfrom那里。
我用SmartSniff抓包也能抓到数据,并且已经发送到Linux下的5000端口上了。为什么还是阻塞。

|
 recvfrom 把参数写全来看看

   int len=sizeof(strucgt sockaddr);
   recvfrom(UDPSocket, buf, 1024*8, 0, (struct sockaddr *)&their_addr, &len);
  
  看看能不能跑通

|
UDP的client端是需要bind的,server端不需要bind,

关于阻塞的问题,应该在于你的socket的属性,设置成O_NONBLOCK就可以了。


|
recvfrom本来就是阻塞,要设置socket属性才可以设置为不阻塞,试试用
int setsockopt (int socket, int level, int optname, void *optval, Function
socklen_t optlen)

This function is used to set the socket option optname at level level for socket socket.
The value of the option is passed in the buer optval of size optlen.
The return value and error codes for setsockopt are the same as for getsockopt.

|
linux上用tcpdump查看是否你真的收到服务器发送的包了.

收到了,再定位client的问题

    
 
 

您可能感兴趣的文章:

  • Linux下read函数默认到底是阻塞的还是非阻塞的?
  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?
  • linux C socke编程 创建的socket默认是阻塞的还是非阻塞的?
  • 请问:我发现在linux上的网络编程时, 若客户端连不上服务端,就会阻塞,但如果是在UNIX上,若连不上,会马上返回,并不阻 塞,怎样让它也能阻塞啊?
  • c/c++ iis7站长之家
  • linux多线程无法进行阻塞方式的读写操作
  • linux下socket的send函数阻塞问题?
  • Linux里的pthread_create会不会阻塞啊?
  • linux socket fd 写阻塞问题
  • Linux系统刚启动起来的时候为什么会阻塞一下?
  • linux shell如何非阻塞写命名管道
  • linux sem_wait 为什么会阻塞进程?
  • linux下消息队列不阻塞
  • 如何linux 程序中启用其他进程,非阻塞,非popen
  • Linux线程阻塞问题 高手请进
  • linux多线程无法进行阻塞方式的读写操作?
  • linux下如何设置一个socket为非阻塞方式?
  • 在Linux下如何等待线程终止,又不会阻塞
  • linux下的非阻塞读取
  • linux epoll的ET模式和LT模式的主要区别是什么呢?为什么ET模式一定要用非阻塞socket?
  • linux下udp的recvfrom问题,大神,我需要你。。。
  • Linux网络抓包的程序 [使用recvfrom之后无限阻塞]
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3