linux下关于发送的问题,答对的100分马上给,刚给了100分的

Megadeth 2003-12-21 12:19:49
加精
linux的发送代码:
ntimes = 0;
while ( nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
printf("write sock for head_len error: errno=%d\n",errno);
if ( errno == EINTR) {
nwritten = 0; /* and call write() again */
ntimes++;
if ( ntimes > 10 ) return 0;
}
else{
return 0; /* error */
}
}
nleft -= nwritten;
ptr += nwritten;
}
我的问题是:
如果发送缓冲区满,而且接收端一段时间不进行接收,比如接收端网速慢或者断开一会儿,那这样做是不是马上就把接收端给否定了?如果是在网络游戏中的话,接收端就会被马上cut掉了。有没有什么办法多给接受端一点机会,呵呵。让他有个1,2分钟的时间,超时的话,才把它cut掉。
...全文
97 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mildwolf 2004-02-18
  • 打赏
  • 举报
回复
测试论坛
rainsly 2003-12-24
  • 打赏
  • 举报
回复
写完了感觉你可能是陷入了tcp层需要处理的一些事情
对于协议原理不够了解所致
嘿嘿
Megadeth 2003-12-24
  • 打赏
  • 举报
回复
非常感谢,结帐!
rainsly 2003-12-24
  • 打赏
  • 举报
回复
我倾向于使用非阻塞
但是这个与数据的发送没太大的关系
区别在与你是否需要为每个连接创建一个线程而已
也就是说
如果你使用阻塞socket
每个连接必须使用一个线程
但如果你使用非阻塞
就不必须这样做了
但是对于用户来讲,你使用哪个都是一样的
他接受数据不会受到影响
你的问题是:如果客户端暂时无法接受消息时
服务器要如何写才能处理好
回答是:
服务端不去管这个,只负责发送数据
如果连接断开了
如果暂停的时间没超出预计值
服务端试图重新连接上并继续发送数据
如果没有,服务端不在试图重新连接
这里讲的是你在应用层如何处理

>>比如客户端速度很慢,游戏切换场景,此时服务器段已经开始向客户端传送场景数据,而客户端还没有调用recv函数,但此时网络确实是畅通的,服务器段用write很快就把缓冲区给填满了,此时服务器端的缓冲区就写不进去了,客户端又要过会才能接受,这些问题,应该怎么处理呢?

对于tcp层:
这个不需要服务端考虑
客户端的tcp/ip协议实现会负责接受数据
如果连客户端的tcp/ip都无法接受数据
//这个一般不可能,除非客户端陷入类似死机的状态
这时服务端会发现发送出的数据全部丢失
这时,服务端的tcp层也会自动负责重传
tcp层尝试一段时间后如果还无法送出去数据
这时他会向上层通告连接已经断开
对于你而言,只要你使用的tcp协议
就不用考虑如果数据暂时无法被客户端接受时的处理
除非时间太长,使得tcp认为连接已经断开
这时如果时间不到你的预期值,你可以试图重新连接
Megadeth 2003-12-24
  • 打赏
  • 举报
回复
rainsly(落英) :
谢谢,你的意思是改为堵塞,改为一个客户对一个线程?这样的效率会不会?1000人的系统能跑吗?
rainsly 2003-12-23
  • 打赏
  • 举报
回复
停止,等待,然后继续传
时间从ms到几分钟
服务端可以等,甚至重新连接续传。
》》线程会被阻塞,这样的话,效率很低,有什么办法呢?
~~~~~~~~
被阻塞时,不算效率低,一个线程对应一个客户。
当然,服务端传送一些特殊数据时也有可能对时间有要求,
这时可以使用带外数据。
//这个情况不多见,而且有很多时候可以改成与时间联系不那么紧密的。
Megadeth 2003-12-22
  • 打赏
  • 举报
回复
我解释一下为什么会出现我说的这种问题,比如客户端速度很慢,游戏切换场景,此时服务器段已经开始向客户端传送场景数据,而客户端还没有调用recv函数,但此时网络确实是畅通的,服务器段用write很快就把缓冲区给填满了,此时服务器端的缓冲区就写不进去了,客户端又要过会才能接受,这些问题,应该怎么处理呢?请各位有经验的高手指教。
Megadeth 2003-12-22
  • 打赏
  • 举报
回复
to boxban(master-dreamer) :
就是服务器端应该怎么处理呢?
我试过用阻塞调用的话,倒是可以在断开后的一段时间又接着传,但是,线程会被阻塞,这样的话,效率很低,有什么办法呢?
lucky2all 2003-12-22
  • 打赏
  • 举报
回复
据我理解,重见链接
boxban 2003-12-22
  • 打赏
  • 举报
回复
那是服务器端的事情,客户端根本无法干预
Megadeth 2003-12-22
  • 打赏
  • 举报
回复
用消息队列也一样要write啊,如果客户端接受不了,该怎么办呢?
boxban 2003-12-22
  • 打赏
  • 举报
回复
采用多线程+消息队列的方法:

一个线程负责接收服务器端数据,并打包好的数据放入一个缓冲区队列中;
接受线程向消息队列中添加一条消息
主线程在空闲时就检测消息队列并处理消息
Megadeth 2003-12-21
  • 打赏
  • 举报
回复
谢谢,我指的cut就是服务器段认为客户端已经断开,然后就把他做善后处理了,呵呵
如果连接没有断开呢,就只是比如网络突然中断几秒钟,这样的话,这个函数几次往缓冲区写数据都失败,那他就把客户端善后了,可是几客户端秒钟后就可以恢复了阿,现在的网络游戏一般是怎么处理的,他都有一个延时的啊,是怎么实现的?
lucky2all 2003-12-21
  • 打赏
  • 举报
回复
如果是tcp,如果链接已断,应需重新分配socket资源值,
如果网速慢到无法接受握手信号的地步,这本身就意味着已经断了

你说的cut是什么意思?

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧