LinuxSir.cn,穿越时空的Linuxsir!

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

监听80端口没有反映在Redhat 9.0

[复制链接]
发表于 2004-4-10 20:48:46 | 显示全部楼层 |阅读模式

  1. #include <unistd.h>
  2. #include <linux/socket.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <fcntl.h>
  9. #include <sys/stat.h>
  10. int
  11. main(void)
  12. {
  13.    int                   sockfd,connfd;
  14.    struct sockaddr_in    servaddr;
  15.    char                  buff[8192];
  16.    sockfd=socket(AF_INET,SOCK_STREAM,0);
  17.    bzero(&servaddr,sizeof(servaddr));
  18.    servaddr.sin_family=AF_INET;
  19.    servaddr.sin_port=htons(80);
  20.    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  21.    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  22.    listen(sockfd,10);
  23.    for( ; ; ) {
  24.           connfd=accept(sockfd,(struct sockaddr *)NULL,NULL);
  25.           read(sockfd,buff,strlen(buff));
  26.           write(STDOUT_FILENO,buff,strlen(buff));
  27.           close(connfd);
  28.    }
  29.    return(0);
  30. }

复制代码

程序写的不好,有错误不知道。。。。。怎么./a.out没有反应??
发表于 2004-4-10 22:34:14 | 显示全部楼层
加上错误处理
 楼主| 发表于 2004-4-10 22:44:28 | 显示全部楼层
,加上后我刷新了网页还是这样,是不是那个端口已经被征用了呢?对网络的原理不太明白》

  1. #include <unistd.h>
  2. #include <linux/socket.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <fcntl.h>
  9. #include <sys/stat.h>
  10. int
  11. main(void)
  12. {
  13.    int                   sockfd,connfd;
  14.    struct sockaddr_in    servaddr;
  15.    char                  buff[8192];
  16.    if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) {
  17.          printf("socket error\n");
  18.          return(1);
  19.    }
  20.    bzero(&servaddr,sizeof(servaddr));
  21.    servaddr.sin_family=AF_INET;
  22.    servaddr.sin_port=htons(80);
  23.    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  24.    for( ; ; ) {
  25.          if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0) {
  26.                 printf("bind error\n");
  27.                 continue;
  28.          }else
  29.                 break;
  30.    }
  31.    for( ; ; ) {
  32.          if(listen(sockfd,10) < 0) {
  33.                 printf("listen error\n");
  34.                 continue;
  35.          }else
  36.                 break;
  37.    }
  38.    for( ; ; ) {
  39.           if((connfd=accept(sockfd,(struct sockaddr *)NULL,NULL)) <0) {
  40.                  printf("accept error\n");
  41.                  continue;
  42.           }
  43.           if(read(sockfd,buff,strlen(buff)) < 0) {
  44.                  printf("read error\n");
  45.                  close(connfd);
  46.                  continue;
  47.           }
  48.           if(write(STDOUT_FILENO,buff,strlen(buff))<0) {
  49.                  printf("write error\n");
  50.                  close(connfd);
  51.                  continue;
  52.           }
  53.           close(connfd);
  54.    }
  55.    return(0);
  56. }
复制代码
发表于 2004-4-10 23:12:03 | 显示全部楼层
如果端口已经被占用了,应该有出错信息,
你把前两个for(;;)去掉,
第三个for(;;)里的每一个if(...都有问题,
if((connfd=accept(sockfd,(struct sockaddr *)NULL,NULL)) <0) {
应该定义一个clientaddr什么的,不要用NULL
if(read(sockfd,buff,strlen(buff)) < 0) {
应该用sizeof(buff),不要用strlen(buff)
if(write(STDOUT_FILENO,buff,strlen(buff))<0) {
应该在read的时候返回一个n,
if((n = read(sockfd,buff,8192)) < 0) {
if(write(STDOUT_FILENO,buff,n)<0) {
发表于 2004-4-11 21:26:17 | 显示全部楼层
一般被占用的话,你一运行,就会告诉你已经被bind的,
顺便问一下lib啊,为什么read要返回一个n,而write不要呢?
发表于 2004-4-12 00:12:20 | 显示全部楼层
read返回的n是读到的字节数,因为不能保证每次都读到8192个字节(事实上一般都读不到这么多),所以要用一个变量n来保存读到了多少个字节,否则你得到的buff就没办法处理(你连那些是有用的都不知道)
write的第三个参数就用到了n,否则输出8192个字节,后面全是乱码
write返回的只是调用是否成功,在if里面直接比较一下就行了,你也可以用一个变量,比如r
r = write(...
if(r < 0)
...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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