LinuxSir.cn,穿越时空的Linuxsir!

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

初学unix网络编程提问

[复制链接]
发表于 2004-1-13 10:14:23 | 显示全部楼层
unp的代码是在bsd的系统下编译的,你装个freebsd基本可以编译,linux。。。算了表编译了
发表于 2004-1-13 10:16:33 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <sys/types.h>
  6. #include <netinet/ip.h>
  7. #include <netinet/tcp.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11. #include <netdb.h>
  12. #include <error.h>
  13. #include <errno.h>
  14. /*#include <readline/readline.h>
  15. #include <readline/history.h>
  16. */

  17. #define SERV_PORT 9999

  18. #define MAXLINE 4096
  19. #define LISTENQ 1024

  20. ssize_t writen(int fd,const void * vptr,long n)
  21. {
  22.   size_t   nleft;
  23.   ssize_t  nwritten;
  24.   const char * ptr;
  25.   ptr=vptr;  
  26.   nleft=n;
  27.   while (nleft>0){
  28.         if((nwritten=write(fd,ptr,nleft))<=0){
  29.                 if(errno==EINTR)
  30.                         nwritten=0;
  31.                 else
  32.                         return(-1);
  33.         }
  34.         nleft-=nwritten;
  35.         ptr+=nwritten;
  36. }
  37. return(0);
  38. }

  39. ssize_t readline(int fd,void * vptr,size_t maxlen)
  40. {  
  41.     ssize_t n,rc;
  42.     char c,* ptr;
  43.     ptr=vptr;
  44.     for(n=1;n<maxlen;n++){
  45.       again:
  46.          if((rc=read(fd,&c,1))==1){            
  47.             *ptr++=c;
  48.             if(c=='\n')
  49.                     break;
  50.     }else if (rc==0){
  51.             if (n==1)
  52.                     return(0);
  53.             else
  54.                     break;
  55.            }else {
  56.                  if (errno==EINTR)
  57.                        goto again;
  58.                  return (-1);
  59.            }
  60.   }
  61. *ptr=0;
  62. return(n);
  63. }

  64. void str_echo(int sockfd)
  65. {
  66.   long       n;
  67.   char      line[MAXLINE];
  68.   for(;;){
  69.    if ((n=readline(sockfd,line,MAXLINE))==0)
  70.      return;
  71.    writen(sockfd,line,n);
  72.    }
  73. }


  74. int main(int argc,char **argv)
  75. {
  76.    int         listenfd,connfd;
  77.    long        childpid;
  78.    socklen_t       clilen;
  79.    struct sockaddr_in     cliaddr,servadd;
  80.    listenfd=socket(AF_INET,SOCK_STREAM,0);
  81.    bzero(&servadd,sizeof(servadd));
  82.    servadd.sin_family=AF_INET;
  83.    servadd.sin_addr.s_addr=htonl(INADDR_ANY);
  84.    servadd.sin_port=htons(SERV_PORT);
  85.    bind(listenfd,(struct sockaddr *)&servadd,sizeof(servadd));
  86.    listen(listenfd,LISTENQ);
  87.    for(;;){
  88.      clilen=sizeof(cliaddr);
  89.      connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
  90.      if((childpid=fork())==0){
  91.          close(listenfd);
  92.          str_echo(connfd);
  93.          exit(0);
  94.          }
  95.       close(connfd);
  96.    }
  97. }
复制代码

这是我在rh8下改写的回射服务器版本。client端好象给我改掉了。。。找不到了,找到贴给你参考下
有些头文件其实不需要的,我不高兴去掉。。。。。
发表于 2004-1-13 10:19:28 | 显示全部楼层
对不起在补充句:在unp里大写开头的应该是作者自己定义的,在我查看了unix c的函数库后发现有部分其实都是系统带的,估计作者是进行了修改来使得程序更健壮。但是因为我们是学习所以我就把这部分改成原来的函数了,基本是差不多的。
有些函数是作者在unp.h里定义的,我就没再定义了,直接用其他方法代替了
发表于 2004-1-14 20:07:19 | 显示全部楼层
我原来在RH7.2下编译过UNP的库,当时怎么做的忘了,好像是稍微改了两三个地方就好了。
UNP里大写开头的函数是为了方便和清晰把错误处理都做到函数里了,直接改过来要注意一下。
发表于 2004-1-20 15:19:21 | 显示全部楼层
我也刚看这本书,
我开始也不行,第一个程序也搞不定

下载源代码
要把unp.h里面的大概114行 是一个struct定义
把这几行注悉掉//编译提示这个struct已经定义(可能linux已经有了定义)
把所有下载的源代码的unp.h都这样改
然后按照readme文件,
运行./configure
到lib库,make
编译lib libfree等等
Accept 是accept的一个修正,他调用了accept,Connect也一样

如果要自己编译程序
要连接你编译好的lib库 如error.o等等

不过按照readme 有些make还是有些错误,估计BSD和linux
还是有很多不同,
我安装的是redhat8.0,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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