• Linux网络编程——TCP通信


    【实验目的】

    1、熟练掌握套接字函数的使用方法。

    2、应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互。

    【实验学时】

        4学时

    【实验内容】

    实现一个服务器与一个客户之间通讯。具体功能如下:

    (1)服务器端:

    服务器端等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号;

    循环接收客户发来的信息并在终端上显示,同时在信息前加入序号并返回给客户端;当从客户接收到bye后不再发送给各户并退出程序。

    (2)客户端:

    根据用户从终端输入的服务器IP地址及端口号连接到相应的服务器;

    连接成功后,循环从终端输入信息,并将信息发送给服务器,再从服务器接收信息,并显示在终端上。

    当从终端输入bye并发送给服务器后,程序退出。


    server:

    #include<stdio.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<stdlib.h>
    
    int main()
    {
    	int sockfd,connectfd;
    
    	char rbuf[100];
    	char wbuf[100];
    
    	int port;
    	char ip[20];
    
    	struct sockaddr_in server;
    	struct sockaddr_in client;
    	socklen_t len;
    	len=sizeof(client);
    	
    	int i=0;
    	
    	//socket()
    	if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){
    	
    		perror("socked failed");
    		exit(1);
    	}
    
    	printf("ip of client: ");
    	scanf("%s", ip);
    	printf("port of client:");
    	scanf("%d", &port);
    
    	bzero(&server, sizeof(server));
    	server.sin_family=AF_INET;
    	server.sin_port=htons(port);
    	server.sin_addr.s_addr=inet_addr(ip);
    
    	//bind()
    	if((bind(sockfd, (struct sockaddr *)&server, sizeof(server)))==-1){
    
    		perror("bind error");
    		exit(1);
    	}
    
    	//listen()
    	if((listen(sockfd, 5))==-1){
    	
    		perror("listen error");
    		exit(1);
    	}
    	
    	//accept()
    	if((connectfd=accept(sockfd, (struct sockaddr *)&client, &len))==-1){
    		
    		perror("accept error");
    		exit(1);
    	}
    
    	//read()/write()
    	while(1){
    	
    		int r=read(connectfd, rbuf, sizeof(rbuf));
    		if(r<0){
    			
    			perror("read error");
    			exit(1);
    		}
    		rbuf[r]='';
    		printf("client: %s
    ", rbuf);
    		
    		if(!strcmp(rbuf, "bye"))
    			break;
    		
    		i++;
    		
    		char buf[100];
    		
    		sprintf(buf, "%d", i);
    		strcat(buf, rbuf);
    
    		int w=write(connectfd, buf, strlen(buf));
    		if(w==-1){
    			
    			perror("write error");
    			exit(1);
    		}
    
    	}
    	
    	//close
    	close(sockfd);
    	close(connectfd);
    
    	return 0;
    }

    client:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<netinet/in.h>
    #include<sys/socket.h>
    
    int main()
    {
    	int sockfd; 
    	char rbuf[100];
    	char wbuf[100];
    	int recv;
    
    	int port;
    	char ip[20];
    
    	struct sockaddr_in server;
    	struct sockaddr_in client;
    	socklen_t len;
    	len=sizeof(client);
    
    	char b[5]="bye";
    	b[3]='
    ';
    
    	//socket()
    	if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){
    	
    		perror("socked failed");
    		exit(1);
    	}
    
    	printf("ip of server: ");
    	scanf("%s", ip);
    	printf("port of server:");
    	scanf("%d", &port);
    
    	bzero(&server, sizeof(server));
    	server.sin_family=AF_INET;
    	server.sin_port=htons(port);
    	server.sin_addr.s_addr=inet_addr(ip);
    
    	//connect()
    	connect(sockfd,(struct sockaddr *)&server,sizeof(server));
    
    	//write()/read()
    	getchar();
    
    	while(1){
    
    		bzero(&wbuf,100);
    		bzero(&rbuf,100);
    	
    		printf("to server :"); 
    		fgets(wbuf,100,stdin);
    
    		write(sockfd,wbuf,strlen(wbuf));
    
    		if(strcmp(b,wbuf)==0)
    			break;
    
    		recv=read(sockfd,rbuf,sizeof(rbuf));
    		rbuf[recv]='';
    		printf("from server :%s",rbuf);
    	}
    
    	//close()
    	close(sockfd);
    
    	return 0;
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    DVWA SQL注入源代码审计
    sqlmap
    sql注入原理+mysql相关知识点
    SQL报错常见的注入姿势
    故障处理流程和规范
    Kafka源码工程examples项目配置log4j
    如何快速安装kafka-manager
    PHP8 新特征
    PHP-面试总结——高并发篇
    Docker 搭建多容器组合服务 (nginx + PHP)
  • 原文地址:https://www.cnblogs.com/wanglaoda/p/4937103.html
Copyright © 2020-2023  润新知