LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: wuhu

奇怪的错误!

[复制链接]
发表于 2004-4-5 21:39:30 | 显示全部楼层
client连接的时候要指定ip地址,不能用
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
这个是server用的,表示接受所有的ip的连接,用在client,它就不知道连那个机子了,你可以本地回路127.0.0.1或者你的ip连
你可以用inet_aton把字符串的ip"127.0.0.1"转换成struct in_addr
发表于 2004-4-5 21:42:20 | 显示全部楼层
另外,你的server退出以后要想重新运行,要等一小会,否则也会得到端口已被占用的错误,这个是tcp的特性,不是错误
发表于 2004-4-6 13:27:46 | 显示全部楼层
:cool:
用setsockopt设置端口复用
 楼主| 发表于 2004-4-6 14:37:49 | 显示全部楼层
这是我修改过的client
  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <errno.h>
  5. #include <netdb.h>
  6. #include <unistd.h>

  7. #define BUFSIZE 8129

  8. int
  9. main(int argc, char **argv)
  10. {
  11.         int        sockfd;
  12.         struct sockaddr_in cliaddr;
  13.         char        buf[BUFSIZE];
  14.         struct hostent *h;
  15.        
  16. //        if (argc !=2){
  17. //                printf(stderr, "usage: client hostname\n");
  18. //                exit(1);
  19. //        }
  20.         if ((h=gethostbyname(argv[1]))==NULL)
  21.         {
  22.                 perror("gethostbyname");
  23.                 exit(1);
  24.         }
  25.         if (sockfd=socket(AF_INET, SOCK_STREAM, 0)<0)
  26.         {
  27.                  perror("socket error");
  28.                 exit(1);
  29.         }
  30.         bzero(&cliaddr, sizeof(cliaddr));
  31.         cliaddr.sin_family = AF_INET;
  32.         cliaddr.sin_port = htons(1234);
  33. //        cliaddr.sin_addr = *((struct in_addr*)h->h_addr);
  34. //        cliaddr.sin_addr.s_addr=((struct in_addr *)(h->h_addr))->s_addr;
  35.         inet_pton(AF_INET, argv[1], &cliaddr.sin_addr);
  36.                
  37.         if(connect(sockfd,(struct sockaddr *) &cliaddr, sizeof(cliaddr))<0)                 {
  38.                 perror("connect");
  39.                 exit(1);
  40.         }
  41.         if (send(sockfd, buf, BUFSIZE, 0)<0)
  42.         {
  43.                 perror("send");
  44.                 exit(1);
  45.         }
  46.         if (recv( sockfd, buf, BUFSIZE, 0)<0)
  47.         {
  48.                 perror("recv");
  49.                 exit(1);
  50.         }
  51.         printf("%s\n", buf);
  52.         close(sockfd);
  53.         exit(0);
  54. }

复制代码

./client
segmentation fault
想破了头还是不明白,又要麻烦大家了!
 楼主| 发表于 2004-4-6 23:20:57 | 显示全部楼层
./client 127.0.0.1
connect: socket operator on a no-socket
我才第一次启动server,端口是1234,
用netstat -a |grep 2329(server pid)
怎么什么都不显示啊?ps里有server啊,是不是还没有启动啊?
发表于 2004-4-7 01:16:39 | 显示全部楼层
你加几个printf,看看是哪一步segmentation fault的,
而且你的程序里的buf光是传来传去的,什么内容也没有呀?
server里还write、send了各一次,没必要吧,
要不然你先把server改一下,回传一个字符串,用telnet先试一下server好着没?
发表于 2004-4-7 11:29:14 | 显示全部楼层

借个人气问一下,和楼主的问题有点相似:)

我使用readline函数时,man readline中要求
  1. #include <stdio.h>
  2.        #include <readline/readline.h>
  3.        #include <readline/history.h>

  4.        char *
  5.        readline (const char *prompt);
复制代码

我也包含了这几个头文件,但编译是报错如下:
  1. [chen@linux-rt shell]$ gcc -o rl.demo readline.c
  2. readline.c:23:2: warning: no newline at end of file
  3. /tmp/ccswiO9x.o: In function `main':
  4. /tmp/ccswiO9x.o(.text+0x44): undefined reference to `readline'
  5. /tmp/ccswiO9x.o(.text+0x9d): undefined reference to `readline'
  6. collect2: ld returned 1 exit status
复制代码

以gcc -c编译没问题,也是连接时的问题。
谢谢给个提示,呵呵
发表于 2004-4-7 14:41:06 | 显示全部楼层
if(connect(sockfd,(struct sockaddr *) &cliaddr, sizeof(cliaddr))<0)       

connect连接到的是服务器的套接口,不是客户端的套接口,这样些容易混淆。
发表于 2004-4-7 22:28:51 | 显示全部楼层
to: cmandcj
编译是加上连接库选项 -lreadline
 楼主| 发表于 2004-4-7 22:42:15 | 显示全部楼层
我把代码修改了,就是client发送一个字符给server,然后server打印在屏幕上,但是老说operation on non-socket上,还有,我
netstat -a查看了,我那个server是*.1234,local addr。不知道是不是有错,还有,我restart network到eth0的时候,就不动了,我自己手动的把自己的地址改成127.0.0.1了,每次都要restart,不然ip就是没有,不知道,这些是不是因素,我./client的时候,指定了连接的ip是127.0.0.1,还是一样的错误,希望大家(lib兄等)帮帮我!谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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