LinuxSir.cn,穿越时空的Linuxsir!

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

编译报错:empty character constant 这是什么原因啊

[复制链接]
发表于 2005-9-1 20:37:36 | 显示全部楼层 |阅读模式
今天看到一版讲linux下c的网络编程的案例,便将程序输入到机器中编译
结果报错:empty character constant
不知道怎么解决,please help me.
/* clinet.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

int main(int argc,char *argv[]) {
       int sockfd,numbytes;
       char buf[100];
       struct hostent *he;
       struct sockaddr_in their_addr;
       int i=0 ;

       he = gethostbyname(argv[1]);

       if (( sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {
          perror("socket");
          exit(1);
       }

their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(2323);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero),8);

if ( connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1) {
  perror("connect");
  exit(1);
}

if (send(sockfd,"hello!",6,0)==-1) {
       perror("send");
       exit(1);
}

if ((numbytes = recv(sockfd,buf,100,0))==-1) {
       perror("recv");
       exit(1);
}

buf[numbytes] = '';
printf("result:%s",buf);
close(sockfd);
return 0;
}

my compile environment:
gcc 3.2.3
gentoo linux
发表于 2005-9-1 21:04:22 | 显示全部楼层
倒数第五行,改为:buf[numbytes] = 0;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-2 02:25:19 | 显示全部楼层
谢谢rickxbx !
编译通过了。
可是,我在一台机器上运用./server &
在一台客户机上运行./client domain
domain即是运行着服务器端的机器

问题是:server端显示:server is running: Illegal seek
(2323端口是listen的,并且从外网telnet 2323也能通)
clinet端开始也没有任何显示
但在clinet端是可以正常解析服务端的域名的。
回复 支持 反对

使用道具 举报

发表于 2005-9-2 09:28:00 | 显示全部楼层
把server代码帖出来看看呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-5 02:15:57 | 显示全部楼层
server.c代码来啦~~~不好意思,晚了些时间:)
/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>


main () {
        int sockfd,new_fd;
        struct sockaddr_in my_addr;
        struct sockaddr_in their_addr;
        int sin_size,numbytes;
        char buff[100];

        if ((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {
                perror("socket");
                exit(1);
        }

        my_addr.sin_family = AF_INET;
        my_addr.sin_port = htons(2323);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(my_addr.sin_zero),8);

        if (bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1) {
                perror("bind");
                exit(1);
        }

        if (listen(sockfd,10)==-1) {
                perror("listen");
                exit(1);
        }

        while(1) {
                sin_size = sizeof(struct sockaddr_in);
                perror("server is running");
                if ((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1) {
                        perror("accept");
                        exit(1);
                }

                if (!fork()) {
                        if ((numbytes = recv(new_fd,buff,strlen(buff),0))==-1 )
                                perror("recv");
                                exit(1);
                        }
                        printf ("%s",buff);

                        if (send(new_fd,buff,strlen(buff),0)==-1) {
                                perror("send");
                                close(new_fd);
                                exit(0);
                        }

                        close(new_fd);
                }
        close(sockfd);
}
回复 支持 反对

使用道具 举报

发表于 2005-9-5 13:40:04 | 显示全部楼层
Post by samwang
server.c代码来啦~~~不好意思,晚了些时间:)

  1. /* server.c */
  2.                 if (!fork()) {
  3.                         if ((numbytes = recv(new_fd,buff,strlen(buff),0))==-1 )
  4.                                 perror("recv");
  5.                                 exit(1);
  6.                         }
  7.                         printf ("%s",buff);

  8.                         if (send(new_fd,buff,strlen(buff),0)==-1) {
  9.                                 perror("send");
  10.                                 close(new_fd);
  11.                                 exit(0);
  12.                         }

  13.                         close(new_fd);
  14.                 }
  15.         close(sockfd);
  16. }
复制代码

父进程和子进程buff里面的内容是不一样的,或者说,他们是不一样的buff.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-6 11:42:53 | 显示全部楼层
不好意思,不是太明白你的意思?
我应该怎样改进我的程序呢?
回复 支持 反对

使用道具 举报

发表于 2005-9-8 10:10:33 | 显示全部楼层
我不明白你为什么要做这样的事:子进程接收数据,然后由父进程输出,再由父进程返回给客户端? 你这个程序似乎没有必要生成一个子进程.
回复 支持 反对

使用道具 举报

发表于 2005-9-8 11:09:29 | 显示全部楼层
应该是父进程接受一个连接后,再产生子进程,由子进程输出.
把if(!fork()) ...改为if (for()) ...即可.
注意,fork()在父子进程中返回值是不同的.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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