LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: wuhu

奇怪的错误!

[复制链接]
发表于 2004-4-7 23:11:39 | 显示全部楼层
前两天没好好看代码,实在抱歉,
你目前的错误在这里:

  1.   close(connfd);
  2.   close(listenfd); [color=red]/* 你在for循环内关闭了listenfd */[/color]
  3. }
  4. exit(0);
复制代码

listenfd是监听的,你一连接就把它关闭了当然不行了,应该是:

  1.   close(connfd);
  2. }
  3. close(listenfd); [color=blue]/* 移到for循环外面 */[/color]
  4. exit(0);
复制代码

另外,你的server有点复杂,自己编的第一个程序最好简单一点,比如接到连接以后就返回一个字符串(著名的"hello, world!")之类的,用telnet之类的程序也好测试,先保证服务器没问题,再写客户端。
发表于 2004-4-7 23:17:13 | 显示全部楼层
另外,127.0.0.1是本地回路的地址,设备是lo,用ifconfig可以看看,
这个和eth0没什么关系,你的eth0估计是配置成DHCP了,而网络中又没有DHCP服务器,所以就比较慢,你可以参考一下你的发行版是如何配置网络的,给eth0指定一个固定的ip
 楼主| 发表于 2004-4-8 23:12:05 | 显示全部楼层
修改后的code

  1. //client.c
  2. #include <stdio.h>
  3. #include <sys/socket.h>
  4. #include <errno.h>
  5. #include <netinet/in.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>

  9. #define        LISTENQ 5
  10. #define BUFSIZE        1024

  11. //void str_echo(int);
  12.        
  13. int
  14. main(int argc, char **argv)
  15. {
  16.         int        listenfd, connfd;
  17.         int        len;
  18.         struct sockaddr_in        servaddr, cliaddr;
  19.         char        buf[BUFSIZE];
  20.         char hello[]="Hello!\n";
  21.        
  22.         if((listenfd = socket(AF_INET, SOCK_STREAM, 0))<0)
  23.                 perror("socket error");
  24.         bzero(&servaddr, sizeof(servaddr));
  25.         servaddr.sin_family=AF_INET;
  26.         servaddr.sin_port =htons(1234);
  27.         servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

  28.         if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0)
  29.         {
  30.                 perror("bind");
  31.                 exit(1);
  32.         }
  33.         if(listen(listenfd, LISTENQ)<0)
  34.         {
  35.                 perror("listen");
  36.                 exit(1);
  37.         }
  38.         for ( ; ; ){
  39.                 len = sizeof(cliaddr);
  40.                 connfd=accept(listenfd, (struct sockaddr *)&cliaddr, &len);
  41.                 if (connfd<0)       
  42.                 {
  43.                         perror("accept");
  44.                         exit(1);
  45.                 }
  46.                 if(write(listenfd, hello, strlen(hello))<0)
  47.                 {
  48.                         perror("write");
  49.                         exit(1);
  50.                 }
  51.                 close(connfd);
  52.         }
  53.         close(listenfd);
  54.         exit(0);
  55. }
  56. // client.c
  57. #include <stdio.h>
  58. #include <sys/socket.h>
  59. #include <netinet/in.h>
  60. #include <errno.h>
  61. #include <netdb.h>
  62. #include <unistd.h>

  63. #define BUFSIZE 1024

  64. int
  65. main(int argc, char **argv)
  66. {
  67.         int        sockfd, n;
  68.         struct sockaddr_in servaddr;
  69.         char        buf[1024];
  70.         struct hostent *host;
  71.        
  72.         if (argc <2){
  73.                 printf("usage: %s <server> <data1>...<dataN)\n",argv[0]);
  74.                 exit(1);
  75.         }
  76.         if ((host=gethostbyname(argv[1]))==NULL)
  77.         {
  78.                 perror("gethostbyname");
  79.                 exit(1);
  80.         }

  81.         if (sockfd=socket(AF_INET, SOCK_STREAM, 0)<0)
  82.         {
  83.                  perror("socket error");
  84.                 exit(1);
  85.         }
  86.         bzero(&servaddr, sizeof(servaddr));
  87.         servaddr.sin_family = AF_INET;
  88.         servaddr.sin_port = htons(1234);
  89.         servaddr.sin_addr = *((struct in_addr*)host->h_addr);
  90. //        servaddr.sin_addr.s_addr=((struct in_addr *)host->h_addr);
  91. //        inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
  92.                
  93.         if(connect(sockfd,(struct sockaddr *) &servaddr, sizeof(servaddr))<0)                 {
  94.                 perror("connect");
  95.                 exit(1);
  96.         }
  97.         if (n=read(sockfd, buf, BUFSIZE)<0)
  98.         {
  99.                 perror("read");
  100.                 exit(1);
  101.         }
  102.         printf("I have received: %s\n", buf);
  103.         close(sockfd);
  104.         exit(0);
  105. }
  106. all : server client
  107. server : server.c
  108.         gcc $^ -o $@
  109. client : client.c
  110.         gcc $^ -o $@
  111. telnet information :
  112. /* Trying 127.0.0.1...
  113. Connected to 127.0.0.1.
  114. Escape character is '^]'.
  115. Connection closed by foreign host.
  116. [1]+  Broken pipe             ./server
  117. */
复制代码

我的意图就是连上server后,把hello送给client,打印出来,
改了有改,还是原来的错误,实在不知道错在什么地方,
我连telnet后的内容都贴上来,实在不明白啊,又要麻烦兄弟们了
发表于 2004-4-9 00:01:39 | 显示全部楼层
前面的应该是server吧,两个程序都有错误,
server:
len = sizeof(cliaddr); // 这一句不需要

if(write(listenfd, hello, strlen(hello))<0)
应该是:
if(write(connfd, hello, strlen(hello))<0)

client:
if (sockfd=socket(AF_INET, SOCK_STREAM, 0)<0)
应该是:
if ((sockfd=socket(AF_INET, SOCK_STREAM, 0))<0)

if (n=read(sockfd, buf, BUFSIZE)<0)
应该是:
if ((n=read(sockfd, buf, BUFSIZE))<0)

printf("I have received: %s\n", buf);
改成:
write(STDOUT_FILENO, buf, n);
或者:
buf[n] = '\0';
printf("I have received: %s\n", buf);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表