Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356975
  • 博文数量: 109
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 1920
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-19 11:17
个人简介

只要活着,就要有目标。

文章分类
文章存档

2013年(109)

我的朋友

分类: LINUX

2013-05-22 15:30:20

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信号。

    原文转自 网,原文链接

 

 

 

阅读(1290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~