免费注册 查看新帖 |

Chinaunix

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

[C] 帮我看看我的socket程序哪里出错了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-28 11:58 |只看该作者 |倒序浏览
SERVER:
循环部分:
while (1) //服务器端要一直运行
   {
        //定义客户端的socket地址结构client_addr
        //接受一个到server_socket代表的socket的一个连接
        //如果没有连接请求,就等待到有连接请求--这是accept函数的特性
        //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
        //new_server_socket代表了服务器和客户端之间的一个通信通道
        //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
        socklen_t length = sizeof(client_addr);
        int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
        if ( new_server_socket < 0)
        {
            printf("Server Accept Failed!\n");
        //    break;
        }
        
        if(!fork()){
        bzero(buffer, BUFFER_SIZE);
        length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
        if (length < 0)
        {
            printf("Server Recieve Data Failed!\n");
          //  break;
        }


        char user_cmd[CMD_ARG+1];
        bzero(user_cmd,CMD_ARG+1);


        strncpy(user_cmd,buffer,strlen(buffer));       
        if(strcmp(user_cmd,"get")==0)
                {cmd_put(server_socket,new_server_socket);}
        else if(strcmp(user_cmd,"put")==0)
                {cmd_get(server_socket,new_server_socket);}
       
       
        else
        {
                printf("Cannot Reply The Command");
        }
        }
        close(new_server_socket);
        waitpid(-1,NULL,WNOHANG);
        //关闭与客户端的连接
    }
        close(server_socket);
        exit(0);
    //关闭监听用的socket

}      

CLIENT:
循环部分:

while(1)
{        printf("Please Input Command:\t");
        scanf("%s", cmd_arg);       
        if(strcmp(cmd_arg,"get")==0)
         {
           send(client_socket,cmd_arg,CMD_ARG,0);
           cmd_get(client_socket);
         }
        else if(strcmp(cmd_arg,"put")==0)
         {
           send(client_socket,cmd_arg,CMD_ARG,0);
           cmd_put(client_socket);
         }
       
        else
         {
                printf("Command error\n\n");       
         }
}
    //关闭socket
    close(client_socket);
    return 0;
}  



实现了文件的上传跟下载,现在的问题是:上面的服务器代码,我只要传一个文件,成功之后,再下载或则上传一个,就会出现“断开的管道”。我不知道是不是我的服务器代码有误,哪个地方被我关了,反复测试反复修改 出现不同的问题,我以为是服务器中的new_server_socket被关了,我就把 close(new_server_socket) 去掉。不关闭它,结果出现的情况是:客户端get一个,输入文件名..然后...阻塞了 ...  按ctrl+c,服务器显示传送成功,客户端也收到了那文件,再次运行客户端,同样的都是那个情况。不知道是我哪部分出错了,请高人指点,修改了非常多次了  找不到答案

论坛徽章:
0
2 [报告]
发表于 2008-08-28 12:15 |只看该作者
怎么没人解答呢  

还是我问的不清楚?

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
3 [报告]
发表于 2008-08-28 12:33 |只看该作者

回复 #2 fengyun1090 的帖子

服务器端处理完一次请求后,就将该连接关闭了!
close(new_server_socket);

所以后续的请求就不能执行了。你这样做应该是短连接方式才对。

另外,父进程中不应该执行close(new_server_socket);吧?

论坛徽章:
0
4 [报告]
发表于 2008-08-28 12:42 |只看该作者

回复 #3 happy_fish100 的帖子

你说的方法我也试过了,将close(new_server_socket)放到子进程中,那样会造成我上面说的 阻塞情况,按ctr+c 客户机结束,然后服务器才显示传送成功
KingofSC 该用户已被删除
5 [报告]
发表于 2008-08-28 12:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
6 [报告]
发表于 2008-08-28 12:51 |只看该作者
原帖由 fengyun1090 于 2008-8-28 12:42 发表
你说的方法我也试过了,将close(new_server_socket)放到子进程中,那样会造成我上面说的 阻塞情况,按ctr+c 客户机结束,然后服务器才显示传送成功


堵塞是因为直接使用recv接收数据的缘故。阻塞方式中,recv调用会一直堵塞,直到:
1. 接收到了指定字节数;
2. 接收到了一定长度的内容,通常为1K多一些;
3. 网络连接中断,如:对端断开连接;
4. 发生错误,比如:被信号中断等等

你描述的情况属于第3种。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2008-08-28 12:57 |只看该作者
应该是子进程调用 close (server_socket). 父进程调用close (new_server_socket) 吧.
减少句柄的引用计数.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2008-08-28 13:00 |只看该作者
bug :

1. 客户端既然是死循环. 服务器的子进程为什么不是死循环? 那客户端再发消息服务器的子进程肯定收不到.
    因为子进程没有调close 所以. 客户端发送没有报错.而是阻塞在那.

论坛徽章:
0
9 [报告]
发表于 2008-08-28 15:20 |只看该作者

回复 #5 KingofSC 的帖子

对的 我是想放在子进程中处理 父进程继续监听 不知道哪里出错了 以前也这么弄 没出错 脑壳发昏

论坛徽章:
0
10 [报告]
发表于 2008-08-28 15:22 |只看该作者

回复 #8 cookis 的帖子

我觉得你说的对,我给子进程加个死循环看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP