• 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!
    ");
    			return -1;
    	
    	}
    	serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
    	if((listenfd=socket(AF_INET,SOCK_STREAM,0))<=0)
    	{
    		printf("socket error!
    ");
    		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!
    ");
    		exit(0);
    		}
    	nread=write(connfd,recvline,strlen(recvline));
    	if(nread<=0)
    	{
    		printf("write error!
    ");
    		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!
    ");
    		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!
    ");
    		}
    	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程序例子小结

    十八、      数据格式

  • 相关阅读:
    2014年科研方面回顾之一
    Woodbury matrix identity
    任务太多,时间太少,GT凶猛,不留情面啊。。。
    Linux系统——inode和block
    Linux系统——系统安全及应用
    Linux系统——ACL权限控制及特殊权限
    Linux系统——引导过程与服务控制
    Linux系统——Raid磁盘阵列
    Linux系统——文件系统与LVM 逻辑
    Linux系统——sed命令
  • 原文地址:https://www.cnblogs.com/james1207/p/3329003.html
Copyright © 2020-2023  润新知