在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753013
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32030
- 最后登录
- 2024-4-26
|
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上运行,
- <font size="3" face="微软雅黑">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;
- }
- </font>
复制代码 客户端:
移植到开发板上运行
- <font size="3" face="微软雅黑">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;
- }
- </font>
复制代码 将ubuntu和开发板的IP设置为同一个网关下,然后打开服务器,让客户端连接通信。
文章出处:CSDN
|
|