TCP回显客户端程序 --错误 请各位牛人看看
时间:2010-09-05
来源:互联网
本帖最后由 kanhfshiys 于 2010-09-05 18:57 编辑
复制代码
server.c
复制代码
- [/code]client.c
-
- [code]#include <stdio.h>
- #include <sys/types.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <unistd.h>
-
- #define PORT 9998
- #define LISTENQ 256
- #define MAXLINE 1024
- extern int errno;
- int readline(int sockfd,char *buf,int maxlen)
- {
- int n,rc;
- char c,*ptr;
- ptr = buf;
- for ( n=0;n<maxlen;n++ )
- {
- again:
- if ( 0<(rc=read(sockfd,&c,1)))
- {
- *ptr++=c;
- if ( c=='\n' )
- {
- break;
- }
- }
- if ( 0>rc )
- {
- if ( errno==EINTR )
- {
- goto again;
- }
- else
- {
- return -1;
- }
- }
- if ( 0==rc )
- {
- if ( n==1 )
- {
- return 0;
- }
- else
- {
- break;
- }
- }
- }
- *ptr='\0';
- return n;
- }
- int writen(int sockfd,const void *buf,int n)
- {
- int nleft;
- const char *Buf;
- int writtn;
- Buf = buf;
- nleft=n;
- while ( nleft>0 )
- {
- writtn=write(sockfd,Buf,nleft);
- if ( writtn<=0 )
- {
- if ( errno=EINTR )
- {
- writtn=0;
- }
- else
- {
- return -1;
- }
- }
- nleft-=writtn;
- Buf+=writtn;
- }
- return n;
- }
-
- void strcli(FILE *fp,int sockfd)
- {
- int n;
-
- char sendline[MAXLINE],recvline[MAXLINE];
- memset(sendline,0,sizeof(sendline));
- memset(recvline,0,sizeof(recvline));
- while ( fgets(sendline,MAXLINE,fp)!=NULL )
- {
- n = 0;
- writen(sockfd,sendline,MAXLINE);
- if ( (n=readline(sockfd,recvline,MAXLINE))==0 )
- {
- fprintf(stderr,"strcli :server terminated prematurely.\n");
- }
- fprintf(stdout,"recvline=%s\n",recvline);
- fflush(stdout);
- memset(sendline,0,sizeof(sendline));
- memset(recvline,0,sizeof(recvline));
- }
- }
- int main(int argc,char **argv)
- {
- int sockfd;
- struct sockaddr_in servaddr;
-
- if ( 0>(sockfd=socket(PF_INET,SOCK_STREAM,0)) )
- {
- perror("socket");
- return -1;
- }
- bzero(&servaddr,sizeof(servaddr));
- servaddr.sin_family=AF_INET;
- servaddr.sin_port=htons(9998);
- if ( 0>inet_pton(AF_INET,argv[1],&servaddr.sin_addr) )
- {
- perror("inet_pton");
- return -1;
- }
- if ( 0>connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) )
- {
- perror("connect");
- return -1;
- }
- strcli(stdin,sockfd);
- return 0;
- }
- #include <stdio.h>
- #include <sys/types.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #define PORT 9998
- #define LISTENQ 256
- #define MAXLINE 1024
- extern int errno;
- int readline(int sockfd,char *buf,int maxlen)
- {
- int n,rc;
- char c,*ptr;
- ptr = buf;
- n = 0;
- for ( n=0;n<maxlen;n++ )
- {
- again:
- if ( 1==(rc=read(sockfd,&c,1)))
- {
- *ptr++=c;
- if ( c=='\n' )
- {
- break;
- }
- }
- if ( 0>rc )
- {
- if ( errno==EINTR )
- {
- goto again;
- }
- else
- {
- return -1;
- }
- }
- if ( 0==rc )
- {
- if ( n==1 )
- {
- return 0;
- }
- else
- {
- break;
- }
- }
- }
- *ptr='\0';
- return n;
- }
- int writen(int sockfd,const void *buf,int n)
- {
- int nleft;
- const char *Buf;
- int writtn;
- nleft=0;
- Buf = (char *)buf;
- nleft=n;
- while ( nleft>0 )
- {
- writtn=write(sockfd,Buf,nleft);
- if ( writtn<=0 )
- {
- if ( errno=EINTR )
- {
- writtn=0;
-
- }
- else
- {
- return -1;
- }
- }
- nleft-=writtn;
- Buf+=writtn;
- }
- return n;
- }
- void str_echo(int sockfd)
- {
- int n;
- char line[MAXLINE];
- for ( ;; )
- {
- n = 0;
- memset(line,0,sizeof(line));
- if ( 0>=(n=readline(sockfd,line,MAXLINE)) )
- {
- return;
- }
- if ( line==NULL )
- {
- continue;
- }
- write(sockfd,line,n);
- }
- }
- int main()
- {
- int lisenfd,connfd;
- pid_t childfd;
- socklen_t clilen;
- struct sockaddr_in cliaddr,servaddr;
-
- if ( 0>(lisenfd=socket(PF_INET,SOCK_STREAM,0)) )
- {
- perror("socket()");
- return -1;
- }
- bzero(&servaddr,sizeof(servaddr));
- servaddr.sin_family=AF_INET;
- servaddr.sin_port = htons(PORT);
- servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
- if ( 0>bind(lisenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) )
- {
- perror("bind()");
- return -1;
- }
- if ( 0>listen(lisenfd,LISTENQ) )
- {
- perror("listen()");
- return -1;
- }
- clilen=sizeof(cliaddr);
- for ( ;; )
- {
- if ( 0>(connfd=accept(lisenfd,(struct sockaddr *)&cliaddr,&clilen)) )
- {
- perror("accept()");
- return -1;
- }
- if ( 0==(childfd=fork()) )
- {
- close(lisenfd);
- str_echo(connfd);
- exit(0);
- }
- close(connfd);
- }
-
- }
作者: kanhfshiys 发布时间: 2010-09-05
本帖最后由 kanhfshiys 于 2010-09-05 18:56 编辑
过程:
$make client
$make server
$./server
$./client 127.0.0.1
然后再客户端输入 ab 并不能回显出ab
但是只要一关闭服务器端 客户端的ab就会显出来了
求助各位大牛!
过程:
$make client
$make server
$./server
$./client 127.0.0.1
然后再客户端输入 ab 并不能回显出ab
但是只要一关闭服务器端 客户端的ab就会显出来了
求助各位大牛!
作者: kanhfshiys 发布时间: 2010-09-05
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28