免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3521 | 回复: 9
打印 上一主题 下一主题

[函数] linux 下 函数send()的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-29 12:58 |只看该作者 |倒序浏览
系统是redhat linux as/4

下面是我写的一段测试代码


  1. void
  2. sendMsg(int sockfd)
  3. {
  4.         int     sendNumBytes, i;
  5.         char    sendBuf[5];
  6.         
  7.         bzero(sendBuf, sizeof(sendBuf));
  8.         fgets(sendBuf, sizeof(sendBuf) - 1, stdin);     
  9.         sendNumBytes = 0;
  10.         for(i = 0; ; i++)
  11.         {      
  12.                 sendNumBytes += send(sockfd, sendBuf + sendNumBytes, 10 - sendNumBytes, 0);
  13.                 printf("loop %d : %d bytes send\n", i, sendNumBytes);

  14.                 if(sendNumBytes == 10)
  15.                         break;  
  16.         }      
  17. }
复制代码


使用这段代码的结果是


[study@server socket]$ ./myclient
a    /*输入a后回车*/
loop 0 : 10 bytes send
[study@server socket]$

我缓冲区定义成5个字节大小,send函数中试图发10个字节。为什么结果是一次就send了10个字节?发完了sendBuf中的5字节后,剩余的5字节是哪里来的呢?

论坛徽章:
0
2 [报告]
发表于 2007-06-29 13:02 |只看该作者
原帖由 while(1) 于 2007-6-29 12:58 发表
系统是redhat linux as/4

下面是我写的一段测试代码

[code]
void
sendMsg(int sockfd)
{
        int     sendNumBytes, i;
        char    sendBuf[5];
        
        bzero(sendBuf, sizeof( ...

数组溢出

论坛徽章:
0
3 [报告]
发表于 2007-06-29 13:04 |只看该作者
同楼上,数组溢出。你只能使用数组范围内的字节,超出就是结果未定义,不知道什么时候死。

论坛徽章:
0
4 [报告]
发表于 2007-06-29 13:04 |只看该作者
原帖由 jaffaz 于 2007-6-29 13:02 发表

数组溢出

你的意思是send()函数在发完sendBuf中的5字节后还会将sendBuf+5后的5个字节发出去?

论坛徽章:
0
5 [报告]
发表于 2007-06-29 13:07 |只看该作者
原帖由 while(1) 于 2007-6-29 13:04 发表

你的意思是send()函数在发完sendBuf中的5字节后还会将sendBuf+5后的5个字节发出去?


不一定,可能会死。

论坛徽章:
0
6 [报告]
发表于 2007-06-29 13:08 |只看该作者
原帖由 while(1) 于 2007-6-29 13:04 发表

你的意思是send()函数在发完sendBuf中的5字节后还会将sendBuf+5后的5个字节发出去?

你都敢叫它发出去,它为什么不敢发?

论坛徽章:
0
7 [报告]
发表于 2007-06-29 13:08 |只看该作者
原帖由 福瑞哈哥 于 2007-6-29 13:04 发表
同楼上,数组溢出。你只能使用数组范围内的字节,超出就是结果未定义,不知道什么时候死。

在这里不会死的,send不修改buffer里面的数据。
当然,传给send 的len很大的话另当别论,可能会收到个 SIGSEGV信号

[ 本帖最后由 jaffaz 于 2007-6-29 13:13 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-06-29 13:13 |只看该作者
原帖由 jaffaz 于 2007-6-29 13:08 发表

在这里不会死的,send不修改buffer里面的数据。

谢谢啊,我想起了一句话:c语言默认程序员明白自己在做什么

论坛徽章:
0
9 [报告]
发表于 2007-06-29 13:14 |只看该作者
原帖由 jaffaz 于 2007-6-29 13:08 发表

在这里不会死的,send不修改buffer里面的数据。
当然,传给send 的len很大的话另当别论,可能会收到个 SIGSEGV信号


一般不会死而已,数组越界访问是结果未定义,当然 可能 会死。

论坛徽章:
0
10 [报告]
发表于 2007-06-29 14:40 |只看该作者
谢谢啊,我想起了一句话:c语言默认程序员明白自己在做什么 [/quote]】

这句话说得好,明白这点说明对c的理解就加深了很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP