| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 746 人关注过本帖
标题:【网络编程】求助
只看楼主 加入收藏
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
结帖率:94.44%
收藏
已结贴  问题点数:100 回复次数:13 
【网络编程】求助
服务端程序:
程序代码:
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/wait.h>
#include<signal.h>
#include<string.h>

#define MAXLEN 1000

void sig_cld(int sig) 
{
    pid_t pid;
    while(  (pid = waitpid(-1, NULL, WNOHANG) )> 0)
        printf("process %d has exited\n", pid);
}


int main(int argc, char **argv)
{
    int listenfd;
    if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        fputs("socket failed", stderr);
    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6014);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(listenfd,(struct sockaddr *) &servaddr, sizeof(servaddr));
    listen(listenfd, 11);
    signal(SIGCHLD, sig_cld);
    while(1) {
        int connfd;
        char recvbuff[MAXLEN], sendbuff[MAXLEN];
        if( (connfd = accept(listenfd, NULL, NULL)) < 0){
            if(errno == EINTR) continue;
                        else fputs("accept Error", stderr);
        }
        pid_t pid;
        if( (pid = fork() )== 0){
            close(listenfd);
            while(read(connfd, recvbuff, MAXLEN) > 0){
                int a,b;
                sscanf(recvbuff, "%d%d", &a, &b);
                sprintf(sendbuff, "%d", a+b);
                if( write(connfd, sendbuff, strlen(sendbuff)) < 0)
                    fputs("Write Error", stderr);
            }
            return 0;  //为什么去掉这行 当关掉客户端时 电脑就会卡死啊? 谁做到么
        }
        close(connfd);
    }
    return 0;
}


客户端程序:
程序代码:
#include<netinet/in.h>
#include<sys/socket.h>
#include<stdio.h>
#include<string.h>

#define MAXLEN 1000
int main(int argc, char *argv[])
{
    if(argc != 2) fputs("Input Error", stderr);
    int sockfd[10], i;
    struct sockaddr_in clientaddr;
    for( i=0; i<10; ++i){
        if((sockfd[i] = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            fputs("socket failed", stderr);
            bzero(&clientaddr,sizeof(clientaddr));
            clientaddr.sin_family = AF_INET;
            clientaddr.sin_port = htons(6014);
            if( inet_pton(AF_INET, argv[1], &clientaddr.sin_addr) <= 0)
                fputs("inet_pton Error", stderr);
        if(connect(sockfd[i], (struct sockaddr *)&clientaddr, sizeof(clientaddr)) < 0)
            fputs("Connect error", stderr);
    }
        

    char recv[MAXLEN],sendbuff[MAXLEN];
    while( fgets(sendbuff, MAXLEN, stdin)  ){
        if(write(sockfd[1], sendbuff, strlen(sendbuff)) < 0)
            fputs("write Error", stderr);
        if( read(sockfd[1], recv, MAXLEN) > 0 ){
            fputs(recv, stdout);
            fputs("\n", stdout);
        }
    }
    
    return 0;
}


为什么去掉服务端那行return 语句 在关闭客户端时  电脑会卡死啊? 求解啊
搜索更多相关主题的帖子: 网络编程 服务端 color 
2012-02-20 12:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:25 
网络编程我不太懂 不过还是自己写过一个  兄弟要是不嫌弃拿去看看

                                         
===========深入<----------------->浅出============
2012-02-20 12:50
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 2楼 laoyang103
绝不嫌弃, 我刚开始学, 什么都不懂 呵呵
2012-02-20 12:51
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:25 
Linux的不太懂, 从代码上看,如果去掉那句return,下面执行的就是close(connfd);

是不是当前进程已经无效了, 无资源可操作了?

不懂, 臆测

为游戏狂~~!!    大家努力编哈!
2012-02-20 13:17
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:25 
虽然不懂linux 下的网络编程。
但思路还是一样的啊。。

while(1)
{
 /// 就一个return 可以跳出循环。
 我没有看到你有别什么可以跳出循环的啊。
你把唯一可以跳出循环的条件除掉了。
肯定死循环了。
}



[ 本帖最后由 小鱼儿c 于 2012-2-20 13:53 编辑 ]

用心做一件事情就这么简单
2012-02-20 13:20
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:25 
sample below with threading module.

This is my project.

https://
2012-02-20 13:21
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
怎么看都觉得逻辑有问题。

你没事起那么多进程干嘛,每次fork()==0 的时候就是main 程序本身 然后就close socket.

看看我那个sample就知道应该怎么处理这个了。
2012-02-20 13:25
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 3楼 草狼
我的QQ里面有你  不过你貌似没上线 我的QQ 553069938

                                         
===========深入<----------------->浅出============
2012-02-20 13:28
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 8楼 laoyang103
果断偷偷加高手老杨的QQ号。。、

用心做一件事情就这么简单
2012-02-20 13:55
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 6楼 Devil_W
建多个进程是想实现下迸发啊, 呵呵
2012-02-20 15:37
快速回复:【网络编程】求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030350 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved