LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1406|回复: 23

奇怪的错误!

[复制链接]
发表于 2004-4-3 18:49:44 | 显示全部楼层 |阅读模式
我写了一个server.c,gcc -c server.c完全通过
但是我gcc -o server server.c时

  1. tmp/ccWsEhiD.o(.text+0x1d): In function `main':
  2. : undefined reference to `sock'
  3. collect2: ld returned 1 exit status
复制代码

看不明白的错误,如果程序本身有错的话,-c的时候就应该出现了啊
-o的时候怎么会出错呢?
发表于 2004-4-3 20:02:30 | 显示全部楼层
能不能把你的SERVER.c全部贴出来呢?
 楼主| 发表于 2004-4-3 21:02:47 | 显示全部楼层

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

  7. #define        LISTENQ 8019
  8. #define BUFSIZE        8129
  9.        
  10. int
  11. main(int argc, char **argv)
  12. {
  13.         int        listenfd, connfd;
  14.         socklen_t        len;
  15.         struct sockaddr_in        servaddr, cliaddr;
  16.         char        buf[BUFSIZE];
  17.         if((listenfd = sock(AF_INET, SOCK_STREAM, 0))<0)
  18.                 perror("socket error");
  19.         bzero(&servaddr, sizeof(servaddr));
  20.         servaddr.sin_family=AF_INET;
  21.         servaddr.sin_port =htons(13);
  22.         servaddr.sin_addr.s_addr=INADDR_ANY;
  23.         if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0)
  24.         {
  25.                 perror("bind");
  26.                 exit(1);
  27.         }
  28.         if(listen(listenfd, LISTENQ)<0)
  29.         {
  30.                 perror("listen");
  31.                 exit(1);
  32.         }
  33.         for ( ; ; ){
  34.                 len = sizeof(cliaddr);
  35.                 if(connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len)<0)       
  36.                 {
  37.                         perror("accept");
  38.                         exit(1);
  39.                 }
  40.                 if(recv(connfd,buf, BUFSIZE,0)<0)
  41.                 {
  42.                         perror("recv");
  43.                         exit(1);
  44.                 }
  45.                 write(connfd, buf, BUFSIZE);
  46.                 if (send(connfd, buf, BUFSIZE,0)<0)

  47.                 {
  48.                         perror("send");
  49.                         exit(1);
  50.                 }
  51.                 close(connfd);
  52.                 close(listenfd);
  53.                 }
  54.                 exit(0);
  55. }
复制代码

第一次写,错误多多,望高手指点一下!
发表于 2004-4-3 21:21:09 | 显示全部楼层
if((listenfd = sock(AF_INET, SOCK_STREAM, 0))<0)
socket吧
发表于 2004-4-3 21:28:46 | 显示全部楼层
会不会是link的问题啊。。就是gcc -o server server -l还要在LINK呢?我在翻翻以前的课本。
发表于 2004-4-3 22:05:12 | 显示全部楼层
if((listenfd = sock(AF_INET, SOCK_STREAM, 0))<0)

if((listenfd = socket(AF_INET, SOCK_STREAM, 0))<0)
 楼主| 发表于 2004-4-3 23:01:27 | 显示全部楼层
是socket的问题,好奇怪哦,怎么编译的时候不包错啊?
郁闷,
我把我的client.c也贴上来吧,

  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <errno.h>
  5. #include <netdb.h>

  6. #define BUFSIZE 8129

  7. int
  8. main(int argc, char **argv)
  9. {
  10.         int        sockfd, listenfd;
  11.         struct sockaddr_in cliaddr,servaddr;
  12.         char        buf[BUFSIZE];

  13.         if (sockfd=socket(AF_INET, SOCK_STREAM, 0)<0)
  14.         {
  15.                  perror("socket error");
  16.         }
  17.         bzero(&cliaddr, sizeof(cliaddr));
  18.         cliaddr.sin_family = AF_INET;
  19.         cliaddr.sin_port = htons(13);
  20.         cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  21.         if(connect(listenfd,(struct sockaddr *) &cliaddr, sizeof(cliaddr))==-1)                 {
  22.                 perror("connect");
  23.                 exit(1);
  24.         }
  25.         if (send(sockfd, buf, BUFSIZE, 0)<0)
  26.         {
  27.                 perror("send");
  28.                 exit(1);
  29.         }
  30.         if (recv( sockfd, buf, BUFSIZE, 0)<0)
  31.         {
  32.                 perror("recv");
  33.                 exit(1);
  34.         }
  35.         printf("%s\n", buf);
  36.         close(sockfd);
  37. }

复制代码

调试的时候,我启动了server,但是怎么说我的端口被用了?
换了端口号,怎么说connect的时候出错啦??
看了那么多code,第一次自己写这么多,错误多多啊,
希望大家指点一下,当错一个错误的例子吧,谢谢!
发表于 2004-4-4 11:42:48 | 显示全部楼层
gcc -c server.c编译干吗要报错呢?如果没有语法错误,自己可以任意取函数名,就象你把socket写成sock,编译器与只是当成一个你自己定义的函数名罢了,至于这个自己定义的函数具体做什么,是由程序员自己负责的。但在连接时就不一样了,连接器要把函数名转换成实际的地址,它当然把不到这个sock函数了。
发表于 2004-4-4 17:27:55 | 显示全部楼层
你的server的端口是13,这个端口很可能已经被占用了,你换个端口试试,最好是大一点的(>1024),server和client都要换。
另外,这个LISTENQ有点大吧,你有那么多连接吗
 楼主| 发表于 2004-4-5 15:13:29 | 显示全部楼层
换过了,是1234,server and client都是一样的,LISTENQ改成5了,我运行了server后,./client,说connect: socket operator
on a no-socket,不知道是什么原因!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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