首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个新手,CS架构,C语言有关问题,望解答

2012-02-06 
一个新手,CS架构,C语言问题,望解答这是这个书上的简单C/S程序,见下面。gcc -o sever server.cgcc -o client

一个新手,CS架构,C语言问题,望解答
这是这个书上的简单C/S程序,见下面。
gcc -o sever server.c
gcc -o client client.c
运行是
./server

另外一个控制台运行
./client 127.0.0.1
原本在客户机输入字符可以返回几个字节altogether,但是现在随便输入什么并不返回,我是新手,望高手帮忙调试下,找找问题,或者给点思路,谢谢!(我的环境死活Fedora+GCC)

服务端

C/C++ code
#include <arpa/inet.h> //防止错误#include <netinet/in.h>//防止错误#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>//#include <Linux/in.h>#define PORT 8888#define BACKLOG 2int main(int argc, char *argv[]) {    int ss, sc;    struct sockaddr_in server_addr;    struct sockaddr_in client_addr;    int err;    pid_t pid;    ss = socket(AF_INET, SOCK_STREAM, 0);    if (ss < 0) {        printf("Socket error \n");        return -1;    } else {        printf("Socket OK!\n");    }    bzero(&server_addr, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);    server_addr.sin_port = htons(PORT);    err = bind(ss, (struct sockaddr*) &server_addr, sizeof(server_addr));    if (err < 0) {        printf("Bind Error\n");    } else {        printf("Bind OK!\n");    }    err = listen(ss, BACKLOG);    if (err < 0) {        printf("Listen Error\n");    } else {        printf("Listen OK! \n");    }    for(;;)    {        int addrlen=sizeof(struct sockaddr);        sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);        if (sc<0){            continue;        }        pid=fork();        if (pid==0)        {            close(ss);            process_conn_server(sc);        }        else        {            close(sc);        }    }    return 0;}void process_conn_server(int s){    ssize_t size=0;    char buffer[1024];    for (;;)        size=read(s,buffer,1024);    if (size==0){        return ;    }    sprintf(buffer,"%d bytes altogether \n",size);    write(s,buffer,strlen(buffer)+1);}

客户端
C/C++ code
#include <arpa/inet.h> //防止错误#include <netinet/in.h>//防止错误#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#define PORT 8888int main(int argc, char *argv[]) {    int s;    struct sockaddr_in server_addr;    int err;    s = socket(AF_INET, SOCK_STREAM, 0);    if (s < 0) {        printf("socket error");    }else{        printf("socket OK!");    }    bzero(&server_addr, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);    server_addr.sin_port = htons(PORT);    inet_pton(AF_INET, argv[1], &server_addr.sin_addr);    connect(s, (struct sockaddr*) &server_addr, sizeof(struct sockaddr));    process_conn_client(s);    return 0;}void process_conn_client(int s) {    ssize_t size = 0;    char buffer[1024];    for (;;) {        size = read(0, buffer, 1024);        if (size > 0) {            write(s, buffer, size);            size = read(s, buffer, 1024);            write(1, buffer, size);        }    }}


[解决办法]
C/C++ code
// server.cvoid process_conn_server(int s){    ssize_t size=0;    char buffer[1024];    for (;;)        size=read(s,buffer,1024); // 这里是个死循环,把这句及其以后都加到foo循环中    if (size==0){        return ;    }    sprintf(buffer,"%d bytes altogether \n",size);    write(s,buffer,strlen(buffer)+1);} 

热点排行