加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

Linux网络编程的谨慎事项

发布时间:2021-11-22 09:53:10 所属栏目:教程 来源:互联网
导读:1、返回值判断 示例: int num = recv(s,buf, MAX,0); 能够从套接字读多少数据不是api参数能够控制的,只能通过返回来确认。 再有就是有些api调用是次序依赖的,前面的错了,后面的也会错。 所以返回值的判断是必须的。 2、端口复用 一般server异常退出后,端
1、返回值判断
 
示例:
 
int num = recv(s,buf, MAX,0);
 
能够从套接字读多少数据不是api参数能够控制的,只能通过返回来确认。
 
再有就是有些api调用是次序依赖的,前面的错了,后面的也会错。
 
所以返回值的判断是必须的。
 
2、端口复用
 
一般server异常退出后,端口没有被系统马上释放,如何才能立即使用端口呢?
 
on = 1;
 
ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
 
3、数据同步
 
server  read/write(recv/send、recvfrom/sendto)<----->client read/write(recv/send、recvfrom/sendto)
 
如果收发端的速度不一致,常常会出现发送多次接收一次或是发送一次接收多次的情况。
 
解决方案:
 
A、缓存接收,加格式头来解析数据
 
使用循环队列,一边接收,一边按设定格式解析。
 
B、应答接收
 
接收端先请求,发送端发一次数据,接收端接收到格式指定的数据后,再发请求,发送再发送数据,依次类推。
 
4、发送数据包大小
 
A、tcp
 
如果write(/send、sendto)的缓存过大,协议层就会拆包发送,如果存在丢包现象(TCP应答机制会重发保证小包发送出去),实时大数据发送的时候,系统性能就会降低。
 
B、udp
 
如果write(/send、sendto)的缓存过大,协议层就会拆包发送,如果存在丢包现象(UDP发包后就不管),实时大数据发送的时候,接收端接收到数据就会不完整。
 
C、tcp及udp
 
如果write(/send、sendto)的缓存过小,譬如每次收发一个字节,大量协议内容就传递一个字节,通讯效能也就低。
 
解决方案:
 
参考内核拆包的最大容量设置及网络吞吐能力,如果应用层数据过大,就需要应用层拆包发送,保证协议层不用拆包。
 
5、字节序
 
两端主机的字节序不一致,如果不作逻辑约定,就会造成接收数据解析错误。
 
解决方案:
 
约定字节序
 
6、缓存字节对齐
 
如果发送的数据不是字节对齐的,就会出现垃圾数据,浪费流量。
 
7、主机异常退出
 
如果server和client正在进行数据交换时候,一端异常退出,就会造成另一端linux系统发出“Pipe Broken”信号,不忽略该信号,就会造成程序被终止。
 
解决方案:
 
send/recv、sendto/recvfrom的标志参数设置成MSG_NOSIGNAL,
 
使用read/write,则先忽略SIGPIPE信号。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读