问题描述:

有个Linux项目用到TCP/IP通讯,但是recv()函数老是阻塞,没有返回;setsockopt()也设置了超时时间,同时在执行recv()之前也增加了select()查看套接字的状态,如果状态异常异常是不会执行recv()函数的


原因分析:

1、recv()是Linux的系统函数,肯定不会卡死,除非Linux内核故障,基本可以排除;
2、客户端向服务器端发送数据,服务器端没有接收,导致缓冲区满,客户端无法接收数据,因此客户端阻塞?等等,我不是加了超时吗?怎么还会阻塞?
3、读写超时设置有问题?还真是,其他函数都做了返回值判断,唯独读写超时没有判断返回值,因此没及时发现问题;读写超时调用的函数时setsockopt(),返回-1,执行失败了,所以recv()一直阻塞

解决方案:

setsockopt() 函数原型如下:

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

sockfd:标识一个套接口的描述字。
level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
optname:需设置的选项。
optval:指针,指向存放选项待设置的新值的缓冲区。
optlen:optval缓冲区长度。

以下是我的使用方式:

int nTimeout=1000;//1秒
// 发送超时
setsockopt(socket,SOL_S0CKET, SO_SNDTIMEO, (char *)&nNetTimeout,sizeof(int));
// 接收超时
setsockopt(socket,SOL_S0CKET, SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int));

上面是 Windows 的用法,对于设置 SO_SNDTIMEO 和 SO_RCVTIMEO,Windows环境下只能传 DWORD;Linux 环境下, 只能传结构体 struct timeval,传 int 会失败,须如下使用:

struct timeval timeout = {1, 0}; // 分别是秒和毫秒// 发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
// 接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

Linux C recv函数阻塞问题相关推荐

  1. Linux下connect函数 阻塞 与 非阻塞 问题

    一.概述 linux系统下,connect函数是阻塞的,阻塞时间的长度与系统相关.而如果把套接字设置成非阻塞,调用connect函数时会报错Operation now in progress,且err ...

  2. linux socket recv函数如何判断收完一包_linux服务器端编程之高性能服务器架构设计总结...

    所谓高性能就是服务器能流畅地处理各个客户端的连接并尽量低延迟地应答客户端的请求:所谓高并发,指的是服务器可以同时支持多的客户端连接,且这些客户端在连接期间内会不断与服务器有数据来往. 这篇文章将从两个 ...

  3. linux socket recv函数 MSG_PEEK标志介绍

    考虑下面的场景,server向client发送数据"_META_DATA_\r\n_USER_DATA_",要求"\r\n"之前的数据_META_DATA_在第 ...

  4. linux socket recv函数如何判断收完一包_linux 下经典 IO 复用模型 epoll 的使用

    1. 概述 epoll 是 linux 内核为处理大批量文件描述符而对 poll 进行的改进版本,是 linux 下多路复用 IO 接口 select/poll 的增强版本,显著提高了程序在大量并发连 ...

  5. linux socket write()函数阻塞卡住线程问题(线程无法结束)write()非阻塞代码

    文章目录 1.参考文章:C++网络通信中write和read的为什么会阻塞 [2.参考文章:网络编程(24)-- linux中write和read函数的阻塞试验](https://blog.csdn. ...

  6. linux函数阻塞,Linux下connect()函数阻塞与非阻塞

    各位好,今天遇到一个奇怪的问题.在写socket客户端的程序时,发现connect()函数有时阻塞,有时非阻塞.且大部分时间是非阻塞的.下面是代码: socket_list[i].socket = s ...

  7. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  8. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  9. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)

    socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...

  10. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...

最新文章

  1. 10种JavaScript开发者必备的VS Code插件
  2. English as a medium of instruction
  3. 计算机网络专业的基础知识,计算机网络专业基础知识.doc
  4. html本地路径图片转成base64,canvas-toDataURL()将图片转为dataURL(base64)
  5. CRM_PRICING_MERGE_FROM_BUPA_OW
  6. 前端学习(2778):uni组件库的使用
  7. 我写过最长的东西可能就是高考作文了
  8. 微博开始动手了:禁言关闭六神磊磊等50个头部账号
  9. myelicpse无法连接mysql_myeclipse连接不到mysql
  10. PyCharm 2020.2.3复制粘贴及删除键修正
  11. 对C#Chart控件使用整理
  12. 微信小程序开发之视频上传
  13. 基于几何图形搭建障碍物地图的方法(MATLAB)
  14. 新世纪Nerv战士 - 京东首页补完计划
  15. dreamweaver8_Dreamweaver 8符合标准!
  16. Linux如何ping本机IP,Linux ping6 本地ipv6地址无效的参数
  17. Win10文件夹中图片不显示预览图解决方法
  18. spring-aop切面
  19. imp导入备份时报:无法转换为环境字符集句柄 ...
  20. 下载百度排行榜音乐的程序(Perl)

热门文章

  1. Unity3d 周分享(22期 2019.8.30 )
  2. 关于删除某文件需要TrustedInstaller权限的解决方法
  3. vba 输出文本 m linux,VBA使用FileSystemObject将读取或写入文本文件(一)
  4. 视频教程-金蝶K3 WISE 视频教程-ERP
  5. 大型体检系统源码 医院PEIS管理系统源码 BS架构
  6. 紧固件基础知识之规格篇和功能篇
  7. AE怎么压缩导出视频体积大小?教程来了
  8. Assign arrow function to a variable before exporting as module default import/no-anonymous-default-
  9. win10 游戏等应用打开时闪退解决方案
  10. 【自学51单片机】1 -- 初步认识单片机及其学习方法 和 单片机基础知识介绍