仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 366|回复: 7
打印 上一主题 下一主题

[其他Linux] 给大家带来Linux下利用TCP通信时碰到的成绩

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 15:39:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。
在这里总结一下这linux用TCP通信必要注重的几个成绩,都是前一阵子事情中碰到的成绩。
成绩1.发送和吸收数据时的不完全成绩
以吸收为例,当对端发送1000个字节的数据时,本端举行吸收,会呈现挪用recv前往500而且errno==EAGAIN的情形(测试中发明这类情形十分严峻),这个毛病暗示以后设备忙,稍后再试。幻想化的办理举措是如许的:
利用select大概epoll机制,当无数据到来时,select或epoll会关照,此时一向吸收直到recv前往0暗示一切数据都吸收完。过程当中当errno==EAGAIN则停息吸收,并将已吸收的数据缓存起来。当设备再次可读时select大概epoll会再次关照,在缓存数据的前面持续吸收,云云重复n次直到recv前往值为0。
可是这类办法必要把已吸收的部分数据举行缓存,完成起来十分烦琐,我举行了以下的复杂完成,是我封装的epoll中的部分代码:
int
mo_epoll_recv(ints,void*buf,intbuf_size,interr)
{
intrecved_len=0;
inttotal_recv_len=0;
intcount=0;
if(buf==NULL||buf_size<=0)
{
return-1;
}
MO_DEBUG("torecvsomedata!
");
do
{
//MO_DEBUG("callrecv,total_recv_len=%drecv_len=%d
",total_recv_len,buf_size-total_recv_len);
recved_len=recv(s,buf+total_recv_len,buf_size-total_recv_len,err);
//MO_DEBUG("calledrecv,recved_len=%d
,errno=%d:EAGAIN=%d:%s
",recved_len,errno,EAGAIN,strerror(errno));
if(recved_len<0&&errno!=EAGAIN)
{
MO_ERROR("someerrorwhenrecverron:%d,%s",errno,strerror(errno));
break;
}
elseif(recved_len<0&&errno==EAGAIN)
{
recved_len=1;
/*10stimeout*/
if(++count>200)
{
break;
}
usleep(1000*50);
continue;
}
total_recv_len+=recved_len;
if(total_recv_len>=buf_size)
{
recved_len=0;
//MO_DEBUG("recv%dbytes!!!!!",total_recv_len);
break;
}
usleep(1000*50);
}while(recved_len>0);
MO_DEBUG("recvsomedataover%dbytes!
",total_recv_len);
if(recved_len==-1)
return-1;
returntotal_recv_len;
}
int
mo_epoll_send(ints,constvoid*buf,intbuf_size,interr)
{
intsended_len=0;
inttotal_send_len=0;
if(buf==NULL||buf_size<=0)
{
return-1;
}
MO_DEBUG("tosendsomedata!
");
do
{
sended_len=send(s,(buf+total_send_len),buf_size-total_send_len,err);
if(sended_len==-1&&errno!=EAGAIN)
{
break;
}
elseif(sended_len==-1&&errno==EAGAIN)
{
sended_len=1;
continue;
}
total_send_len+=sended_len;
if(total_send_len>=buf_size)
{
sended_len=0;
//MO_DEBUG("send%dbytes!!!!!",total_send_len);
break;
}
}while(sended_len>0);
MO_DEBUG("sendsomedataover%dbytes!
",total_send_len);
if(sended_len==-1)
return-1;
returntotal_send_len;
}

成绩2.洁净的封闭socket,应当利用以下办法来封闭你不利用的socket,不要仅仅挪用close():
cleanclose(ints)
{
inti=0;
charbuf[100];
/*封闭写进*/
shutdown(s,SHUT_WR);
/*吸收一切数据*/
do
{
i=recv(s,buf,100,0);
}while(i>0);
/*封闭读取*/
shutdown(s,SHUT_RD);
/*封闭socket*/
close(s);
}
</p>
如果你想在以后的生涯中在软件行业工作的话,学习linux是一项基本技能,所以打从你打算学习linux那天起,放弃windows吧!因为它除了能给你带来片刻的娱乐,别无其他;
爱飞 该用户已被删除
沙发
发表于 2015-1-26 17:57:41 | 只看该作者
上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.
第二个灵魂 该用户已被删除
板凳
发表于 2015-2-4 20:46:45 | 只看该作者
笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-10 09:49:49 | 只看该作者
再次,Linux是用C语言编写的,我们有学习C语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。?
柔情似水 该用户已被删除
5#
发表于 2015-3-1 09:39:08 | 只看该作者
下面笔者在论坛看到的一个好问题: “安装红旗4.0后,系统紫光输入法自带的双拼方案和我的习惯不一样,如何自定义双拼方案解决?谢谢?”这个问题很简练。
变相怪杰 该用户已被删除
6#
发表于 2015-3-10 16:41:46 | 只看该作者
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
谁可相欹 该用户已被删除
7#
发表于 2015-3-17 09:08:57 | 只看该作者
说实话小时候没想过搞IT,也计算机了解也只是一些皮毛,至于什么UNIX,Linux,听过没见过,就更别说用过了。?
不帅 该用户已被删除
8#
发表于 2015-3-24 04:58:49 | 只看该作者
甚至目前许多应用软件都是基于它的。可是没有哪一个系统是十分完美的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表