IMX8M学习--MYZR-i.MX8M-EVK网络应用编程(TCP)

一、 如何实现跨主机?
套接字socket()编程

二. 网络编程
1、 网络体系结构模型
OSI模型: 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 -> 7
TCP/IP协议模型: 应用层 传输层、网络层、 网络接口与物理层 -> 4

2、 数据是如何发送?
数据经过每一个处理层,都会添加对应的头数据。数据到达目标主机后,会不断解析每一层头数据。

三、传输层协议
TCP协议、UDP协议

1、 TCP协议?
面向于有连接的传输方式,是一种可靠的方式。 -> (打电话)
听电话人 -> 服务器端
打电话人 -> 客户端

2、 TCP协议工作流程
套接字其实是一个特殊文件描述符,所以占用系统资源。
端口号 -> 16位 0~65535 0~1023已经被系统占用,用户有效: 1024~65536
IP地址 -> 32位

/* Address to accept any incoming messages. */
#define INADDR_ANY ((unsigned long int) 0x00000000) -> /usr/include/linux/in.h

服务器:
在ubuntu上运行,

void *routine(void *arg)
{
	int connfd = *(int *)arg;
	char buf[50];
	while(1)
	{
		bzero(buf,sizeof(buf));
		fgets(buf,50,stdin);
		send(connfd,buf,strlen(buf),0);
		if(strncmp(buf,"quit",4) == 0)
		{
			exit(0);
		}
	}
}
 int main(int argc,char *argv[])
 {
	 /*1.创建一个TCP协议的未连接套接字*/
	 int sockfd = socket(AF_INET,SOCK_STREAM,0);
	 /*2.绑定号码到未连接套接字上*/
	 struct sockaddr_in srvaddr,cliaddr;
	 socklen_t len = sizeof(srvaddr);

	 bzero(&srvaddr,len);
	 bzero(&cliaddr,len);
	 
	 srvaddr.sin_family = AF_INET;
	 srvaddr.sin_port = htons(atoi(argv[1]));
	 srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	 
	 bind(sockfd,(struct sockaddr *)&srvaddr,len);
	 /*3.设置监听套接字*/
	 listen(sockfd,5);
	 /*4.阻塞接受对方连接*/
	 int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
	 if(connfd > 0)
	 {
		 perror("connection fail:\n");
	 }
	 /*5.创建一个子线程,用于发送数据*/
	 pthread_t tid;
	 pthread_create(&tid,NULL,routine,(void*)&connfd);
	 /*6.主线程负责接受对方发送来的信息*/
	 char buf[50];
	 while(1)
	 {
		 bzero(buf,50);
		 recv(connfd,buf,sizeof(buf),0);
		 printf("from client:%s",buf);
		 if(strncmp(buf,"quit",4) == 0)
		{
			exit(0);
		}
	 }
	 /*7.挂断*/
	 close(connfd);
	 close(sockfd);
	return 0;
 }

客户端:
移植到开发板上运行

void *routine(void *arg)
{
	int sockfd = *(int *)arg;
	char buf[50];
	while(1)
	{
		bzero(buf,sizeof(buf));
		recv(sockfd,buf,sizeof(buf),0);
		printf("from server:%s",buf);
		if(strncmp(buf,"quit",4) == 0)
			exit(0);
   }
}
int main(int argc,char *argv[])
{
	//1. 创建一个TCP协议的未连接套接字
	int sockfd = socket(AF_INET,SOCK_STREAM,0); //sockfd是未连接套接字
	//2. 准备对方的IP地址,端口号
	struct sockaddr_in srvaddr;
	socklen_t len = sizeof(srvaddr);
	bzero(&srvaddr,len);

	srvaddr.sin_family = AF_INET;
	srvaddr.sin_port = htons(atoi(argv[2]));
	inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
	//3. 发起连接
	int ret;
	ret = connect(sockfd,(struct sockaddr *)&srvaddr,len);
	if(ret < 0)
	{
		printf("connect error!\n");
	}
	
	//5. 创建一个子线程,用于发送数据
	pthread_t tid;
	pthread_create(&tid,NULL,routine,(void *)&sockfd);

	//4. 畅聊
	char buf[50];
	while(1)
	{
		bzero(buf,50);
		fgets(buf,50,stdin);
		send(sockfd,buf,strlen(buf),0);
		
		if(strncmp(buf,"quit",4) == 0)
		break;
		
	}
	//5. 挂断电话
	close(sockfd);
	return 0;
}

将ubuntu和开发板的IP设置为同一个网关下,然后打开服务器,让客户端连接通信。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值