读书人

初学C 网络编程 书下照抄例子 但是

发布时间: 2012-10-21 09:00:07 作者: rapoo

初学C 网络编程, 书上照抄例子, 但是出错。
服务端: 接受客服端输入的字符, 转换为大写, 送回。

C/C++ code
/* server.c */#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#define MAXLINE 80#define SERV_PORT 8000int main(void){    struct sockaddr_in servaddr, cliaddr;    socklen_t cliaddr_len;    int listenfd, connfd;    char buf[MAXLINE];    char str[INET_ADDRSTRLEN];    int i, n;    listenfd = socket(AF_INET, SOCK_STREAM, 0);    bzero(&servaddr, sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    servaddr.sin_port = htons(SERV_PORT);    bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));    listen(listenfd, 20);    printf("Accepting connections...\n");    while (true)    {    cliaddr_len = sizeof(cliaddr);    connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);        n = read(connfd, buf, MAXLINE);    printf("received from %s at port %d\n",        inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),        ntohs(cliaddr.sin_port));    for (i = 0; i < n; i++)        buf[i] = toupper(buf[i]);    write(connfd, buf, n);    close(connfd);    }    return 0;}


客服端: 发送字符数据
C/C++ code
/* client.c */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#define MAXLINE 80#define SERV_PORT 8000intmain(int argc, char *argv[]){    struct sockaddr_in servaddr;    char buf[MAXLINE];     int sockfd, n;    char *str;    if (argc != 2)    {    fputs("usage: ./client message\n", stderr);    return 1;    }    str = argv[1];    sockfd = socket(AF_INET, SOCK_STREAM, 0);    bzero(&servaddr, sizeof(servaddr));    servaddr.sin_family = AF_INET;    inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);    servaddr.sin_port = htons(SERV_PORT);    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));    write(sockfd, buf, MAXLINE);    printf("Response from server: \n");    write(STDOUT_FILENO, buf, n);    close(sockfd);    return 0;}


运行环境:
平台——Linux 64 位系统
gcc——4.6.3

运行结果:
server 提示如下错误
Accepting connections ...
Segmentation fault (core dumped)

client 收到结果是乱码

我没有抄错代码, 我复制粘贴试过了, 一样出问题。


[解决办法]
你发送过去的就是乱码

缺一行代码
strcpy(buf,str);
[解决办法]
用gdb调试下
[解决办法]
服务器端:
printf("received from %s at port %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
ntohs(cliaddr.sin_port));
其中inet_ntop返回值是int,以%s去显示它,导致core
应该用char *inet_ntoa(...)来显示客户端的IP地址

[解决办法]
/*client.c 从哪里获取的server response?*/
write(sockfd, buf, MAXLINE);//向服务器写
printf("Response from server: \n");
write(STDOUT_FILENO, buf, n);//向标准输出写

在写向标准输出写前,先从服务器读,加上
n=read(sockfd,buf,MAXLINE);
[解决办法]
探讨

你发送过去的就是乱码

缺一行代码
strcpy(buf,str);

------解决方案--------------------


客户端的n呢,客户端的发buf干啥?发MAXLEN干啥?str不用?strlen呢?服务端的\0呢?
[解决办法]
以前我也不加-Wall,后来习惯在makefile里面加上它,一方面能发现更多的问题,一方面能养成自己良好的编程习惯。

有些库GCC是可以帮你加载的,有些函数GCC是可以帮你声明的。
但是……还是相信自己最好

读书人网 >C语言

热点推荐