免费注册 查看新帖 |

Chinaunix

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

问一个关于socket的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-09 17:06 |只看该作者 |倒序浏览
最近写了2个用socket的小程序,一个是服务器端的,一个是客户端。
客户端从键盘上输入一行字符串,通过网络发给服务器端 ,服务器端程序显示 这行字符串。不知道为什么服务器端一运行就死掉了,用gdb单步调试,发现服务器端的buf接收到了客户端发来的数据,不知道为什么会出错。。
服务器端运行的时候连wait...都没显示出来。
while (1)
{
        printf("%s","wait...";
        size=recv(infd,buf,50,0);
        buf[size]='\0';
        printf("%d",size);
        printf(buf);
}

论坛徽章:
0
2 [报告]
发表于 2005-05-09 17:18 |只看该作者

问一个关于socket的问题

如果想看wait...
就在printf后面加个fflush(stdout);哈

为防止越界访问,请注意buf的大小,别让你recv后的size大过了buf的范围

论坛徽章:
0
3 [报告]
发表于 2005-05-09 17:30 |只看该作者

问一个关于socket的问题

加上fflush(stdout);就正常了。。。

现在还没明白是为什么。。

论坛徽章:
0
4 [报告]
发表于 2005-05-09 17:52 |只看该作者

问一个关于socket的问题

加个 \n 可能也行.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-05-09 18:22 |只看该作者

问一个关于socket的问题

行缓冲.

论坛徽章:
0
6 [报告]
发表于 2005-05-09 19:13 |只看该作者

问一个关于socket的问题

原帖由 "zwjdelphi" 发表:
加上fflush(stdout);就正常了。。。

现在还没明白是为什么。。

要是就正常了,我就要不明白了...
fflush(stdout)只不过是把缓冲区内的数据输出马上输出到标准输出上而已
你原来的问题跟这个没关系的...

size=recv(infd,buf,50,0);
buf[size]='\0';
这样写很容易越界,如果recv返回-1,或者大于你的buf的大小,你就core dump了,你后来好了,可能是你发的数据少了, size没大过buf的大小,别让问题莫名其妙的被解决,那样没进步的

还有,你这个while(1)好象也是死循环,汗一把先,这么点代码,问题多多
写程序,需要仔细啊

论坛徽章:
0
7 [报告]
发表于 2005-05-10 08:12 |只看该作者

问一个关于socket的问题

谢谢virmin的提醒。稍微修改了下程序。。。
PS:这个我是故意编成死循环的,因为主要是试验下socket。

不过为什么加上fflush(stdout);程序就正常了,还是没明白。。
由于客户端在程序里面限制了字符串长度限制在40字节以下,就是说size一直都在40以下,而buf指向的块有300个字节,所以暂时不会出现越界问题。

为什么原来会没法显示客户端发出的字符串呢?为什么加上fflush就能显示呢??

while (1)
{
printf("%s","wait...";
fflush(stdout);
if ((size=recv(infd,buf,50,0))==-1)  exit(1);
buf[size]='\0';
printf("%d",size);
printf(buf);
}

论坛徽章:
0
8 [报告]
发表于 2005-05-10 09:19 |只看该作者

问一个关于socket的问题

我被你难倒了...

论坛徽章:
0
9 [报告]
发表于 2005-05-11 10:51 |只看该作者

问一个关于socket的问题

原帖由 "zwjdelphi" 发表:


养成好习惯:

  1. size=recv(......);
  2. if (size==-1) {
  3.     perror("recv");
  4.     /*出错处理*/
  5. }
  6. buf[size]='\0';
复制代码


对于所调用的函数,如果以后会用到他的结果,一定要检查是否成功调用。

论坛徽章:
0
10 [报告]
发表于 2005-05-11 17:33 |只看该作者

问一个关于socket的问题

socket其实就是一个文件句柄,我自己实验中也发现如果使用了printf,而不刷新的话,就会dump掉。估计是不使用printf,系统文件句柄不会释放吧,这样你的socket就会挂死。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP