+ -
当前位置:首页 → 问答吧 → TCP回显客户端程序 --错误 请各位牛人看看

TCP回显客户端程序 --错误 请各位牛人看看

时间:2010-09-05

来源:互联网

本帖最后由 kanhfshiys 于 2010-09-05 18:57 编辑
  1. [/code]client.c

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

  8. #define PORT 9998
  9. #define LISTENQ 256
  10. #define MAXLINE 1024
  11. extern int errno;
  12. int readline(int sockfd,char *buf,int maxlen)
  13. {
  14.     int n,rc;
  15.     char c,*ptr;
  16.     ptr = buf;
  17.     for ( n=0;n<maxlen;n++ )
  18.     {
  19.         again:
  20.         if ( 0<(rc=read(sockfd,&c,1)))
  21.         {
  22.             *ptr++=c;
  23.             if ( c=='\n' )
  24.             {
  25.                 break;
  26.             }
  27.         }
  28.         if ( 0>rc )
  29.         {
  30.             if ( errno==EINTR )
  31.             {
  32.                 goto again;
  33.             }
  34.             else
  35.             {
  36.                  return -1;
  37.             }
  38.         }
  39.         if ( 0==rc )
  40.         {
  41.             if ( n==1 )
  42.             {
  43.                 return 0;
  44.             }
  45.             else
  46.             {
  47.                 break;
  48.             }
  49.         }
  50.     }
  51.     *ptr='\0';
  52.     return n;
  53. }
  54. int writen(int sockfd,const void *buf,int n)
  55. {
  56.     int nleft;
  57.     const char *Buf;
  58.     int writtn;
  59.     Buf = buf;
  60.     nleft=n;
  61.     while ( nleft>0 )
  62.     {
  63.         writtn=write(sockfd,Buf,nleft);
  64.         if ( writtn<=0 )
  65.         {
  66.             if ( errno=EINTR )
  67.             {
  68.                 writtn=0;
  69.             }
  70.             else
  71.             {
  72.                 return -1;
  73.             }
  74.         }
  75.         nleft-=writtn;
  76.         Buf+=writtn;
  77.     }
  78.     return n;
  79. }

  80. void strcli(FILE *fp,int sockfd)
  81. {
  82.     int n;
  83.    
  84.     char sendline[MAXLINE],recvline[MAXLINE];
  85.     memset(sendline,0,sizeof(sendline));
  86.     memset(recvline,0,sizeof(recvline));
  87.     while ( fgets(sendline,MAXLINE,fp)!=NULL )
  88.     {
  89.          n = 0;
  90.          writen(sockfd,sendline,MAXLINE);
  91.          if ( (n=readline(sockfd,recvline,MAXLINE))==0 )
  92.          {
  93.              fprintf(stderr,"strcli :server terminated prematurely.\n");
  94.          }
  95.          fprintf(stdout,"recvline=%s\n",recvline);
  96.          fflush(stdout);
  97.          memset(sendline,0,sizeof(sendline));
  98.          memset(recvline,0,sizeof(recvline));
  99.     }
  100. }
  101. int main(int argc,char **argv)
  102. {
  103.     int sockfd;
  104.     struct sockaddr_in servaddr;

  105.     if ( 0>(sockfd=socket(PF_INET,SOCK_STREAM,0)) )
  106.     {
  107.         perror("socket");
  108.         return -1;
  109.     }
  110.     bzero(&servaddr,sizeof(servaddr));
  111.     servaddr.sin_family=AF_INET;
  112.     servaddr.sin_port=htons(9998);
  113.     if ( 0>inet_pton(AF_INET,argv[1],&servaddr.sin_addr) )
  114.     {
  115.         perror("inet_pton");
  116.         return -1;
  117.     }
  118.     if ( 0>connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) )
  119.     {
  120.         perror("connect");
  121.         return -1;
  122.     }
  123.     strcli(stdin,sockfd);
  124.     return 0;
  125. }
复制代码
server.c
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #define PORT 9998
  8. #define LISTENQ 256
  9. #define MAXLINE 1024
  10. extern int errno;
  11. int readline(int sockfd,char *buf,int maxlen)
  12. {
  13.     int n,rc;
  14.     char c,*ptr;
  15.     ptr = buf;
  16.     n = 0;
  17.     for ( n=0;n<maxlen;n++ )
  18.     {
  19.         again:
  20.         if ( 1==(rc=read(sockfd,&c,1)))
  21.         {
  22.             *ptr++=c;
  23.             if ( c=='\n' )
  24.             {
  25.                 break;
  26.             }
  27.         }
  28.         if ( 0>rc )
  29.         {
  30.             if ( errno==EINTR )
  31.             {
  32.                 goto again;
  33.             }
  34.             else
  35.             {
  36.                  return -1;
  37.             }
  38.         }
  39.         if ( 0==rc )
  40.         {
  41.             if ( n==1 )
  42.             {
  43.                 return 0;
  44.             }
  45.             else
  46.             {
  47.                 break;
  48.             }
  49.         }
  50.     }
  51.     *ptr='\0';
  52.     return n;
  53. }
  54. int writen(int sockfd,const void *buf,int n)
  55. {
  56.     int nleft;
  57.     const char *Buf;
  58.     int writtn;
  59.     nleft=0;
  60.     Buf = (char *)buf;
  61.     nleft=n;
  62.     while ( nleft>0 )
  63.     {
  64.         writtn=write(sockfd,Buf,nleft);
  65.         if ( writtn<=0 )
  66.         {
  67.             if ( errno=EINTR )
  68.             {
  69.                 writtn=0;
  70.                
  71.             }
  72.             else
  73.             {
  74.                 return -1;
  75.             }
  76.         }
  77.         nleft-=writtn;
  78.         Buf+=writtn;
  79.     }
  80.     return n;
  81. }
  82. void  str_echo(int sockfd)
  83. {
  84.     int n;
  85.     char line[MAXLINE];
  86.     for ( ;; )
  87.     {
  88.         n = 0;
  89.         memset(line,0,sizeof(line));
  90.         if ( 0>=(n=readline(sockfd,line,MAXLINE)) )
  91.         {
  92.             return;
  93.         }
  94.         if ( line==NULL )
  95.         {
  96.             continue;
  97.         }
  98.         write(sockfd,line,n);
  99.     }
  100. }
  101. int main()
  102. {
  103.     int lisenfd,connfd;
  104.     pid_t childfd;
  105.     socklen_t clilen;
  106.     struct sockaddr_in cliaddr,servaddr;

  107.     if ( 0>(lisenfd=socket(PF_INET,SOCK_STREAM,0)) )
  108.     {
  109.         perror("socket()");
  110.         return -1;
  111.     }
  112.     bzero(&servaddr,sizeof(servaddr));
  113.     servaddr.sin_family=AF_INET;
  114.     servaddr.sin_port = htons(PORT);
  115.     servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  116.     if ( 0>bind(lisenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) )
  117.     {
  118.         perror("bind()");
  119.         return -1;
  120.     }
  121.     if ( 0>listen(lisenfd,LISTENQ) )
  122.     {
  123.         perror("listen()");
  124.         return -1;
  125.     }
  126.     clilen=sizeof(cliaddr);
  127.     for ( ;; )
  128.     {
  129.         if ( 0>(connfd=accept(lisenfd,(struct sockaddr *)&cliaddr,&clilen)) )
  130.         {
  131.             perror("accept()");
  132.             return -1;
  133.         }
  134.         if ( 0==(childfd=fork()) )
  135.         {
  136.             close(lisenfd);
  137.             str_echo(connfd);
  138.             exit(0);
  139.         }
  140.         close(connfd);
  141.     }      

  142. }
复制代码

作者: kanhfshiys   发布时间: 2010-09-05

本帖最后由 kanhfshiys 于 2010-09-05 18:56 编辑

过程:
$make client
$make server
$./server
$./client  127.0.0.1

然后再客户端输入 ab  并不能回显出ab

但是只要一关闭服务器端 客户端的ab就会显出来了


求助各位大牛!

作者: kanhfshiys   发布时间: 2010-09-05

相关阅读 更多