哪一种Winsock的send方法是对的?

dba_1984 2010-01-12 09:16:29
//方法一
char sendbuff[2048];
int nBytes = 2048;

//一些初始化代码

ret = send(s, sendbuff, nBytes, 0);

/***************************************************/

//方法二
char sendbuff[2048];
int nBytes = 2048;
int nLeft = nBytes;
int idx = 0;

//一些初始化代码

while(nLeft > 0) {
ret = send(s, &sendbuff[idx], nLeft, 0);
if (ret == SOCKET_ERROR) {
//错误处理
}

nLeft -= ret;
idx += ret;
}
...全文
154 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
不动如岳 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qingfeng_happy5 的回复:]
我觉得似乎该区分阻塞和非阻塞模式,阻塞下用第一种就可以了。非阻塞下用第二种更保险。一家之言,请大家指教。
[/Quote]
这个才对,
阻塞下,第二种,代码冗余。
非阻塞下,第二种,正确。
yuanmoren 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
第二种对,因为send函数调用成功时,其返回值表示实际发送的字节数。
[/Quote]
每天回帖即可获得10分可用分
vclongking 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ryanwen 的回复:]
第二种对,只有这样才能保证报文不会丢失
[/Quote]顶这个
jeam0402 2010-01-13
  • 打赏
  • 举报
回复
mark
qingfeng_happy5 2010-01-13
  • 打赏
  • 举报
回复
我觉得似乎该区分阻塞和非阻塞模式,阻塞下用第一种就可以了。非阻塞下用第二种更保险。一家之言,请大家指教。
Ryanwen 2010-01-13
  • 打赏
  • 举报
回复
第二种对,只有这样才能保证报文不会丢失
JonathanS666 2010-01-13
  • 打赏
  • 举报
回复
第一种就可以。缓存不用用户来处理。
dengsf 2010-01-13
  • 打赏
  • 举报
回复
同意 10 楼。

一般用 1 即可。

对常见的TCP实现,send都是将数据放到缓冲区,
如果本次放不完(即返回值<指定值),下次循环也不会放入(EWOULDBLOCK)。
但也有可能在两次send之间,系统收到对方新的确认而释放缓冲区,但机会不大。
不动如岳 2010-01-13
  • 打赏
  • 举报
回复
http://blog.vckbase.com/arong/archive/2010/01/03/40672.html
这个教程里面的,并没有send的实际原理解释,只是那么说了,究竟为什么是那样?啥时候会产生发不全的情况,都没有说明。

这个我以前没有仔细看过tcp的发送模式,不知道这个每次能够放入socket缓冲区中的字节数,和这个返回值有啥关系。
我想:这个send的返回值应该指的就是放入socket缓冲区中的字节数吧。
如果缓冲区满的话,会不会出现没有全部放入的情况?
wade008 2010-01-13
  • 打赏
  • 举报
回复
第二种会比较好,因为可以保证是发了多少
xwsn007 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
第二种对,因为send函数调用成功时,其返回值表示实际发送的字节数。
[/Quote]

同意
zhaohongbo83 2010-01-13
  • 打赏
  • 举报
回复
有效长度+1就可以了!为什么必须是2048?
sksgod 2010-01-13
  • 打赏
  • 举报
回复
方法都对,第二种好像哪里见过,文件传输里面
arong1234 2010-01-12
  • 打赏
  • 举报
回复
第二次是从此前发送的字节后面那个字节开始发送的,
&sendbuff[idx]就是在计算新位置。
这不是“没用必要”的问题,而是必须这么做!你一次发送1万字节,如果循环不停发送,必然丢了很多报文

看看这个:http://blog.vckbase.com/arong/archive/2010/01/03/40672.html
[Quote=引用 4 楼 zhaoze87 的回复:]
我觉得第二种那样写没有必要的,已经指定了要一次性发送2048字节的数据,还有必要再逐次发送吗?
[/Quote]
许文君 2010-01-12
  • 打赏
  • 举报
回复
第二种多此一举
小马喝水 2010-01-12
  • 打赏
  • 举报
回复
我觉得第二种那样写没有必要的,已经指定了要一次性发送2048字节的数据,还有必要再逐次发送吗?
cnzdgs 2010-01-12
  • 打赏
  • 举报
回复
第二种对,因为send函数调用成功时,其返回值表示实际发送的字节数。
不动如岳 2010-01-12
  • 打赏
  • 举报
回复
我记得,我以前做过一次发送一万左右的字节,能够正常发送,不需要啥循环的。
不动如岳 2010-01-12
  • 打赏
  • 举报
回复
有啥不同吗?
这么做,没有必要吧。你可以在第二个循环里面,打印个log,看它执行了几次。
这个和缓冲区不知道有没有关系,我也不是太清楚了。

send的时候,那个len是有效长度,像你那样的话,如果buffer不满,他会发送乱码到另一端的。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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