Linux系统编程---Socket套接字之回射服务器-(+详细解释)

回射服务器

简单的说就是即从客户端收到什么数据,就发送什么数据回去

先看功能实现部分代码:

 **前提须知**:read读取不到信息会阻塞等待!
 **执行过程**: 1 -》2-》5-》6-》3-》4
         /* 客服端部分 */
      1  scanf("%s",wbuf);//等待键盘输入 
      2  write(sfd,wbuf,strlen(wbuf));//写入服务器
	  3  read(sfd,rbuf,sizeof(rbuf));//等待客服端写会
      4  printf("%s\n",rbuf);//打印内容
        ----------------------分割线------------------------------
        /*服务器部分*/
      5  read(confd,buf,sizeof(buf)); //阻塞等待
	  6  write(confd,buf,len); //写会客服端

简单流程

(1)首先客服端与服务器建立连接
(2)客服端等待键盘输入(scanf 或者 fget)
(3)如果此时键盘输入回车确认 客服端write写入服务器 服务器read读到了信息
(4)服务器再将read读到的信息write写回客服端 客服端read接受到信息并打印

服务器完整代码如下 (可直接复制使用 )

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
	int sockfd,confd;
	char ipstr[128];
	int size;
	char buf[1024];
	int i;
	int len;
	//两个结构体 一个用于绑定身份到套接字  一个用于接收客服端的结构体
	struct sockaddr_in serveraddr,clientaddr; 
	//1.创建监听套接字
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	//2.bind(通信需要套接字 我把我家的地址 门牌号绑上去 ip和端口)
	bzero(&serveraddr,sizeof(serveraddr)); //类似memset 清空结构体
	//地址族协议,选择IPV4
	serveraddr.sin_family = AF_INET;     //属于ipv4还是ipv6
	//IP地址 本机任意可用ip地址
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
	serveraddr.sin_port = htons(8002);//端口号
	
	bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
	
	//3.监听 128为服务器连接的总和
	listen(sockfd,128);
	
	size = sizeof(clientaddr);
	//4.accept 阻塞监听 客服端链接的请求
	//参数二结构体的转换
	confd = accept(sockfd,(struct sockaddr *)&clientaddr,&size); 
	
	//输出客服端的ip和端口
	printf("client ip%s ,port %d\n",inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,ipstr,sizeof(ipstr)),
		ntohs(clientaddr.sin_port));
	
	//5.处理客户端请求
	//读和谐
     
	while(1)
	{
		len=read(confd,buf,sizeof(buf)); //接受不到 阻塞等待
	#if 0  //if 0 endif   之间的大小写转换代码已经屏蔽
		i=0;
		while(i<len)
		{
			buf[i]=toupper(buf[i]);//小写转大写的操作
			i++;	
		}
	#endif
		write(confd,buf,len);
		memset(buf,0,1024);
		
	}
	close(confd);
	close(sockfd);
	return 0;
}

客服端完整代码如下

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char* argv[])
{
	int sfd;
	struct sockaddr_in sfdaddr; //指定要连接服务器的结构体 ip 端口
	int len;
	//char buf[1024];
	char wbuf[1024];
	char rbuf[1024];
	//1.socket  通信用套接字,创建一个socket
	sfd = socket(AF_INET,SOCK_STREAM,0);         
	char ipstr[] = "127.0.0.1";                  //或者本机测试ip
	//char ipstr[] = "192.168.3.106";           //要连上的ip地址
	//初始化地址
	bzero(&sfdaddr,sizeof(sfdaddr));
	
	sfdaddr.sin_family = AF_INET;
	sfdaddr.sin_port = htons(8002);
	
	inet_pton(AF_INET,ipstr,&sfdaddr.sin_addr.s_addr); //转换ip 保存到结构体内 
	
	//2.connect  主动连接服务器  sfd返回客服端的套接字(文件描述符)
	connect(sfd,(struct sockaddr *)&sfdaddr,sizeof(sfdaddr));	
	//3.读写	
    while(1)
	{        
        memset(wbuf,0,1024);
        memset(rbuf,0,1024);
        scanf("%s",wbuf);
        write(sfd,wbuf,strlen(wbuf));
		len=read(sfd,rbuf,sizeof(rbuf));
		//write(STDOUT_FILENO,buf,len);
        printf("%s\n",rbuf);
			
	}	
	//4.close
	close(sfd);
	
	return 0;
}

执行结果

在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页