免费注册 查看新帖 |

Chinaunix

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

又是SOCKET问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-04 09:51 |只看该作者 |倒序浏览
现在有个TCP SOCKET程序。客户端等待用户输入数据,输完后回车发送,在提示用户输入数据。
服务器端接收客户端每次发送的数据 ,并且Printf出来,再等待客户端发送数据打印。但是我用CTRL-C Kill客户端后,服务器端一直不停打印客户端最后一次的发送的数据。
    我想让服务器端在客户端退出时打印一句提示,并且继续等待新的客户端连接,需要如何处理??

论坛徽章:
0
2 [报告]
发表于 2008-05-04 09:55 |只看该作者
server端的recv要判断是否等于0.

论坛徽章:
0
3 [报告]
发表于 2008-05-04 10:14 |只看该作者
判断recv返回值没用的,我想TCP通信时任何一端关闭时都会向对方发送消息。只是不知道发送什么

[ 本帖最后由 wangrenjun12 于 2008-5-4 10:16 编辑 ]

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
4 [报告]
发表于 2008-05-04 10:54 |只看该作者
为什么没用? 听楼上高见.

论坛徽章:
0
5 [报告]
发表于 2008-05-04 11:00 |只看该作者
原帖由 wangrenjun12 于 2008-5-4 10:14 发表
判断recv返回值没用的,我想TCP通信时任何一端关闭时都会向对方发送消息。只是不知道发送什么

recv返回0,就表示对端关闭了。

论坛徽章:
0
6 [报告]
发表于 2008-05-04 11:23 |只看该作者
man recv如下
RETURN VALUE
       These calls return the number of bytes received,  or  -1  if  an  error
       occurred.

难道当客户端kill 时服务器端接收的到大小为0字节??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2008-05-04 11:28 |只看该作者
原帖由 wangrenjun12 于 2008-5-4 11:23 发表
man recv如下
RETURN VALUE
       These calls return the number of bytes received,  or  -1  if  an  error
       occurred.

难道当客户端kill 时服务器端接收的到大小为0字节??

嗯。

论坛徽章:
0
8 [报告]
发表于 2008-05-04 14:10 |只看该作者
浪费了一天时间,修改了N次,现在总算调试通了,关键部分代码如下。客户端可以通过发送exit命令和CTRL-C命令让让服务器端和客户端同时退出。

while(strcmp(recvbuf,"exit")!=0)
  {                                 
        size=recv(nsockfd,recvbuf,LENGTH,0);
        while(recvbuf[i])
    {
        count++;
        i++;
    }
        switch(count)
        {
            case -1:
            printf("ERROR: Receive string error!\n");
                close(sockfd);
                return (0);
               
           case  0:
                //close(sockfd);

        close(nsockfd);
                return(0);
           case 4:
          if(strcmp(recvbuf,"exit")==0)
          {
        close(sockfd);
        close(nsockfd);
        exit (0);
          return (0);
            }
           else
           {
           printf ("OK: Receviced numbytes = %d \n \tReceviced string is: %s \n", count,recvbuf);
               break;
        }              
           default:
                printf ("OK: Receviced numbytes = %d \n \tReceviced string is: %s \n", count,recvbuf);
               break;           
       }
}


客户端代码如下。

while(1)
    {
        printf("Please input information to send\n");
        scanf("%s",&sendbuf);
           printf("your iunput information is %s. \n",sendbuf);
       if(strcmp(sendbuf,"exit")==0)
       {
               close(sockfd);   
            return (0);         
       }
         send(sockfd,sendbuf,LENGTH,0);
    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP