UNIX网络编程---TCP客户/服务器程序示例(五)
一、概述
客户从标准输入读入一行文本,并写给服务器
服务器从网络输入读入这行文本,并回射给客户
客户从网络输入读入这行回射文本,并显示在标准输出上
二、TCP回射服务器程序:main函数
这里给了函数简单的main的实现
#define MAXLINE 1024 void str_echo(int); int main(int argc,char *argv[]) { struct sockaddr_in serveraddr,cliaddr; char recvline[MAXLINE+1]; int nread; int listenfd,connfd,connlen; int pid_t; connlen=1; memset(&cliaddr,0,sizeof(cliaddr)); bzero(&serveraddr,sizeof(struct sockaddr_in)); serveraddr.sin_port=htons(1222); serveraddr.sin_family=AF_INET; if(argc>=2){ if(!inet_aton(argv[1],&serveraddr.sin_addr)) printf("inet_aton error!\r\n"); return -1; } serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); if((listenfd=socket(AF_INET,SOCK_STREAM,0))<=0) { printf("socket error!\r\n"); return 0; } bind(listenfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); listen(listenfd,5); for(;;) { connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&connlen); if((pid_t=fork())==0) { close(listenfd); str_echo(connfd); exit(0); } close(connfd); } return 0; }
三、TCP回射服务器程序:str_echo函数
void str_echo(int connfd) { char recvline[MAXLINE+1]; int nread; memset(recvline,0,sizeof(recvline)); nread=read(connfd,recvline,sizeof(recvline)); if(nread<=0) { printf("read error!\r\n"); exit(0); } nread=write(connfd,recvline,strlen(recvline)); if(nread<=0) { printf("write error!\r\n"); exit(0); } }
四、TCP回射客户程序:main函数
#define MAXLINE 1024 void str_cli(FILE *,int); int main(int argc,char *argv[]) { struct sockaddr_in cliaddr; int nread,connfd; char recvline[MAXLINE+1]; memset(recvline,0,sizeof(recvline)); connfd=socket(AF_INET,SOCK_STREAM,0); if(connfd<=0) { printf("socket error!\r\n"); return 0; } bzero(&cliaddr,sizeof(struct sockaddr_in)); cliaddr.sin_family=AF_INET; cliaddr.sin_port=htons(1222); cliaddr.sin_addr.s_addr=inet_addr("192.168.5.163"); if(connect(connfd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))) { printf("connect error!\r\n"); } str_cli(stdin,connfd); exit(0); }
五、TCP回射客户程序:str_cli函数
void str_cli(FILE *fp,int connfd) { int nread; char recvline[MAXLINE+1]; memset(recvline,0,sizeof(recvline)); fgets(recvline,sizeof(recvline),fp); write(connfd,recvline,strlen(recvline)); memset(recvline,0,sizeof(recvline)); read(connfd,recvline,sizeof(recvline)); fputs(recvline,stdout); }
六、正常启动
七、正常终止
八、Posix信号处理
九、处理sinchld信号
十、Wait和waitpid函数
十一、 Accept返回前连接中止
十二、 服务器进程终止
十三、 Sigpipe信号
十四、 服务器主机崩溃
十五、 服务器主机崩溃后重启
十六、 服务器主机关机
十七、 Tcp程序例子小结
十八、 数据格式