为什么经常看到socket的recv函数一个一个字节的接收数据

anglesean10 2013-04-11 02:44:11
一起收不行吗? 我经常看到这种代码
char recvBuffer[1024];
char ch;
int i=0;
while(1)
{
int nLen = recv(sock,&ch,1,0);
if(nLen <= 0){
closesocket(sock);
break;
}
recvBuffer[i++] = ch;
}

为什么不直接写成
recv(sock,recvBuffer,1024,0);
closesocket(sock);
我直接指定收1024个字节, 即使是对方只发送一两个字节,它也会智能的断掉连接的啊?
...全文
623 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2013-04-12
  • 打赏
  • 举报
回复
引用 4 楼 Dobzhansky 的回复:
读一个, 太常见了, 只是从 os socket 实现的内部缓冲中读取, 碉堡了
正解,fread每次1字节完全正常,read每次1字节就是脑残了。
赵4老师 2013-04-12
  • 打赏
  • 举报
回复
引用 6 楼 anglesean10 的回复:
引用 3 楼 zhao4zhong1 的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html 大哥,换个台词行吗……
等你掉进去再爬出来的那一天!
pengliqing1113 2013-04-12
  • 打赏
  • 举报
回复
好像没有必要一个一个字节接收
小黑小宝 2013-04-12
  • 打赏
  • 举报
回复
无法参透代码作者的禅机。。。
sduxiaoxiang 2013-04-12
  • 打赏
  • 举报
回复
神奇的代码 实际敢这么用 会被玩死
m4a1sas 2013-04-11
  • 打赏
  • 举报
回复
呃...一个协议包头也要收好几次啊....
一桶姜山 2013-04-11
  • 打赏
  • 举报
回复
好奇为啥经常看到这种代码 收个长度头,再循环收是这样的吧
anglesean10 2013-04-11
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
大哥,换个台词行吗? 我每提一个SOCKET的问题你就要这样回答一次,你的机器人不更新吗?
Dobzhansky 2013-04-11
  • 打赏
  • 举报
回复
比如, 基于文本的协议, 封装一个 readline.
Dobzhansky 2013-04-11
  • 打赏
  • 举报
回复
读一个, 太常见了, 只是从 os socket 实现的内部缓冲中读取, 碉堡了
赵4老师 2013-04-11
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
starytx 2013-04-11
  • 打赏
  • 举报
回复
缓冲区的大小要合适,太小太大都不好,一个字节一个字节的真没见过
qq120848369 2013-04-11
  • 打赏
  • 举报
回复
脑残能干出这种事。
打开链接下载源码: https://pan.quark.cn/s/00575f7dee5f 在 Socket 编程领域中,send 与 recv 函数扮演着核心的网络通信角色。这些函数主要用于客户端与服务器之间实现数据的交互。在 TCP/IP 协议框架下,send 函数负责将数据传输至服务器端,而 recv 函数则用于从服务器端获取数据。关于 send 函数,其函数原型为 ssize_t send(int sockfd, const void *buf, size_t len, int flags); 其中,参数 sockfd 指代 socket 文件描述符,buf 指向要发送的数据缓冲区,len 表示发送数据的长度,flags 则包含发送相关的标志位。send 函数的执行结果为实际发送的字节量,若返回值小于 0,则意味着发送操作未能成功,具体的错误信息存储在 errno 变量中。在网络编程实践中,send 函数的执行可能呈现两种状态:1. 发送成功:当 send 函数返回值大于 0 时,表明数据已成功发送。2. 发送失败:当 send 函数返回值小于 0 时,表明发送操作失败,错误详情记录于 errno 变量。关于 recv 函数,其函数原型为 ssize_t recv(int sockfd, void *buf, size_t len, int flags); 参数 sockfd 同样是 socket 文件描述符,buf 是接收数据的缓冲区,len 代表最大接收数据长度,flags 为接收操作的相关标志。recv 函数的返回值代表实际接收到的字节数,若返回值小于 0,则表示接收过程出错,错误码保存在 errno 变量内。在网络编程中,recv 函数的行为也可能分...

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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