socket开发总结
1.connect
阻塞socket connect时会等待返回结果,等于0表示成功,小于0表示失败。
非阻塞socket connect时会立刻返回结果,等于0表示成功,小于0且errno == EINPROGRESS时表示连接正在进行,此时应该等待该socket触发写信号,触发时获取该socket的SO_ERROR选项,根据此值来判断socket是否connect成功。
2.send
[1]返回值等于发送长度,则表示成功。
[2]返回值小于发送长度,但是大于0,则表示发送缓冲区已满,等待继续发送剩下的数据。
[3]返回值小于0,如果(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == 0)这些情况时,表示需要再次尝试发送。
[4]返回值等于0,表示传入的长度参数就是0或者缓冲区已满,应该尝试继续发送。
阻塞和非阻塞的处理方式是一样的,只有返回值小于0时,才能判断errno的值,否则errno的值是无效的。
如果send时,当前socket已经断开(对方已经关闭),此时底层会抛出一个SIGPIPE信号,这个信号的缺省处理方法是退出进程,所以需要设置忽略此信号。
3.recv
[1]返回值大于0表示接收成功。
[2]返回值小于0时,如果(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == 0)这些情况时,表示需要再次尝试接收。
[3]返回值等于0时,表示连接断开,需要关闭socket。
阻塞和非阻塞的处理方式是一样的,只有返回值小于0时,才能判断errno的值,否则errno的值是无效的。
4.accept
accept之后会返回一个新的socket,注意要看情况给这个socket设置相关的选项。
5.select、epoll
[1]select(maxfd + 1, &rfd, &wfd, NULL, &timeout);
最后一个参数是超时时间,如果传0(struct timeval timeout = {0,0})表示只遍历一遍就返回。如果传NULL,表示直到遍历到有事件才返回。如果传大于0的值,则表示超时时间。
[2]epoll_wait(fd, events_ready, max_fd, -1);
LT模式:socket有事件时通知应用程序,例如有读事件时:此时可以read缓冲区的部分或者全部数据(直到返回-1,errno为EAGAIN),也可以不做任何处理,因为下次epoll_wait时,如果缓冲区有数据还会再次触发信号。
ET模式:socket有事件时通知应用程序,但是只会通知一次,直到应用程序做了操作导致下次状态改变时才会再次触发,例如有读事件时:必须把缓冲区数据读完。这个模式只支持非阻塞socket。
缺省是LT模式,如果要使用ET模式,则添加事件时加上EPOLLET标记:event.events = EPOLLIN | EPOLLOUT | EPOLLET;
注意select和epoll的最后一个值是超时时间,如果这个函数后面还有其他流程处理(例如检查状态等),则一定要设置一个固定的超时时间或者填0。
6.socket相关操作
/*设置文件打开数*/
struct rlimit l;
l.rlim_cur = ;
l.rlim_max = ;
setrlimit(RLIMIT_NOFILE, &l); /*忽略SIGPIPE信号,否则对端关闭socket时,本端调用send()函数会导致进程退出*/
signal(SIGPIPE, SIG_IGN); /*connect触发写信号时,通过判断该值判断连接是否成功。*/
int cc, optlen = sizeof(cc);
getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&cc, (void *)&optlen); /*设置socket的发送、接收缓冲区*/
int size = * *;
setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (void *)&size, sizeof(size));
setsockopt(sk, SOL_SOCKET, SO_RCVBUF, (void *)&size, sizeof(size)); /*阻塞socket设置收发超时时间*/
struct timeval tv = {,};
setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(struct timeval));
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)); /*获取tcp socket的目的地址*/
struct sockaddr_in server_addr;
getsockname(fd, (struct sockaddr *)&server_addr, &addrlen);
7.内核相关参数
//设置socket的发送、接收缓冲区最大值
sysctl -w net.core.rmem_max=
sysctl -w net.core.wmem_max= //设置可以绑定的端口范围,多并发时使用
echo >/proc/sys/net/ipv4/ip_local_port_range //设置快速回收TIME_WAIT连接
sysctl net.ipv4.tcp_tw_recycle=
socket开发总结的更多相关文章
- IOS socket开发基础
摘要 详细介绍了iOS的socket开发,说明了tcp和udp的区别,简单说明了tcp的三次握手四次挥手,用c语言分别实现了TCPsocket和UDPsocket的客户端和服务端,本文的作用是让我们了 ...
- Android Socket 开发技术
根据之前的经验,应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然后就是WebServic ...
- Socket开发
Socket开发框架之消息的回调处理 伍华聪 2016-03-31 20:16 阅读:152 评论:0 Socket开发框架之数据加密及完整性检查 伍华聪 2016-03-29 22:39 阅 ...
- 练习题|网络编程-socket开发
1.什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件),C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 2.互联网协议是什么?分别介绍五层协议中每一 ...
- socket 开发 - 那些年用过的基础 API
---------------------------------------------------------------------------------------------------- ...
- 网络编程-socket开发
练习: 1.什么是C/S架构? 2.互联网协议是什么?分别介绍五层协议中每一层的功能? 3.基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手 4.为何基于tcp协议的通信比基于u ...
- andriod socket开发问题小结
andriod socket开发问题小结 个人信息:就读于燕大本科软件project专业 眼下大四; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构 ...
- c socket 开发测试
c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...
- 一篇看懂Socket开发
Socket[套接字]是什么,对于这个问题,初次接触的开发人员一般以为他只是一个通讯工具. Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发 T ...
- 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础
上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...
随机推荐
- 百川sdk----自己的WebViewClient不被执行【废弃,新版本百川已修复此问题】
我在百川sdk的旺旺群中,追问这个问题N多次,一直没有人答复,哎,凡事都要靠自己..... 1.先查看下百川sdk中,是怎么处理咱们传递过去的 WebViewClient public class l ...
- 炸金花游戏(3)--基于EV(期望收益)的简单AI模型
前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...
- aufac在mvc中多线程
注册的时候 将容器放到静态变量中 xxx.IocContainer = builder.Build(); var resolver = new AutofacDepende ...
- css详细笔记
CSS中的块级元素与行内元素 块级元素特性: 1.占据一整行,总是重起一行并且后面的元素也必须另起一行显示. 2.内联元素特性: 3.和其他内联元素显示在同一行. 块级元素列举如下: div(文档分区 ...
- SQL-函数-014
SQL中函数的种类: 聚合函数.数学函数.字符串函数.时间函数.元数据函数 聚合函数: sum():求和函数 select SUM(Admin.age) as Age from Admin max() ...
- 一个python小爬虫
自定义获取豆瓣网电影TOP250里的排名数量 主要思路:先由requests库获取html基本信息,然后用BeautifulSoup来进行html.parser格式解析,逐个获取Tag属性,并且对内容 ...
- 多系统引导 Grub
目录 1. 多系统引导程序 1.1 简介 1.2 Grub History 1.3 支持Windows系统下安装的grub版本 1.4多系统引导程序对比: 1.5 相关参考 1.5.1 Grub 2 ...
- 使用docker构建简约高效的镜像
背景介绍 最近在思考一个问题,我的golang运行到docker环境上的时候,需要安装很大依赖.思考发现我需要就是一个运行二进制的环境而已并不需要golang的编译器等等其他任何多余的. 当前的doc ...
- 机器学习基础一(TP,TN,FP,FN等)
TP:预测为正向(P),实际上预测正确(T),即判断为正向的正确率 TN:预测为负向(N),实际上预测正确(T),即判断为负向的正确率 FP:预测为正向(P),实际上预测错误(F),误报率,即把负向判 ...
- hello1 hello2 服务器安装加部署全过程
1.安装maven和glassfish及配置环境变 首先搜索并下载maven3.6.0和glassfish4.1.1(版本看按需要选择). 点击安装包进行安装 安装完成后开始配置环境变量 打开系统环境 ...