socket开发总结

时间:2020-12-19 23:45:48

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开发总结的更多相关文章

  1. IOS socket开发基础

    摘要 详细介绍了iOS的socket开发,说明了tcp和udp的区别,简单说明了tcp的三次握手四次挥手,用c语言分别实现了TCPsocket和UDPsocket的客户端和服务端,本文的作用是让我们了 ...

  2. Android Socket 开发技术

    根据之前的经验,应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然后就是WebServic ...

  3. Socket开发

    Socket开发框架之消息的回调处理 伍华聪 2016-03-31 20:16 阅读:152 评论:0     Socket开发框架之数据加密及完整性检查 伍华聪 2016-03-29 22:39 阅 ...

  4. 练习题|网络编程-socket开发

    1.什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件),C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 2.互联网协议是什么?分别介绍五层协议中每一 ...

  5. socket 开发 - 那些年用过的基础 API

    ---------------------------------------------------------------------------------------------------- ...

  6. 网络编程-socket开发

    练习: 1.什么是C/S架构? 2.互联网协议是什么?分别介绍五层协议中每一层的功能? 3.基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手 4.为何基于tcp协议的通信比基于u ...

  7. andriod socket开发问题小结

    andriod socket开发问题小结 个人信息:就读于燕大本科软件project专业 眼下大四; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构 ...

  8. c socket 开发测试

    c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...

  9. 一篇看懂Socket开发

    Socket[套接字]是什么,对于这个问题,初次接触的开发人员一般以为他只是一个通讯工具. Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发 T ...

  10. 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

    上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...

随机推荐

  1. C#实现自动单击

    最新玩了一下上学时候玩的游戏,但游戏里面变化太多了,进去后等级就很高,要不停地点击鼠标加技能. 所以利用工作中常用的C#调用 API不停地点击鼠标. 如图: 为方便在基础上修改,我把整个解决方案放到百 ...

  2. 【BZOJ】1086: [SCOI2005]王室联邦

    http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题意:n个点的树,要求分块,使得每一块的大小在[b, 3b]内且块与某个点形成的块是连通的(某 ...

  3. C#中Delegate和Event以及它们的区别(转载)

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  4. TextView文字排版问题:

    本文转载自:http://blog.sina.com.cn/s/blog_821e2bb101011803.html textview自动换行导致混乱的原因----半角字符与全角字符混乱所致!一般情况 ...

  5. 关于FIND_IN_SET 和distinct 的坑爹的一天

    FIND_IN_SET的使用,前面介绍过,distinct是结果去重复的函数,两者结合使用,却花费了我一天的光阴. 1.先面试含有重复值正确的显示顺序select  lIdfrom tbCourse1 ...

  6. 【C语言】浅谈可变参数与printf函数

    一.何谓可变参数 int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用& ...

  7. Unity3D之物理射线

    射线:从一个点往一个方向,发射一根无限长的射线,这根射线会与场景中带有 Collider 组件的物体发生碰撞. 射线的使用: public class Test { private void Star ...

  8. weblogic启动项目,设置内容、设置的数据源链接不生效

    昨天坑自己了一把,把weblogic的数据库连接方式由jdbc改成了jndi,然后不生效,还是走之前jdbc的连接地址. 因为数据库用户之前权限有问题,所以一直纠结于这个地方,忘记了缓存的原因. 后来 ...

  9. Tomcat,JBoss与JBoss Web

    最近接触到应用服务器JBoss,此外JBoss Web与Tomcat也同为web服务器,便查阅资料对三者进行比较,供大家参考. 一.Tomcat Tomcat 服务器是免费开源的Web 应用服务器.支 ...

  10. 怎么打印 sql 语句

    1.添加jar包 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api< ...