树莓派学习:建立socket进行网络通信+tcp+udp+端口+字节序+socketAPI+地址转换API+聊天对话框实战

这篇具有很好参考价值的文章主要介绍了树莓派学习:建立socket进行网络通信+tcp+udp+端口+字节序+socketAPI+地址转换API+聊天对话框实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

socket套接字网络通信学习

数据协议

tcp

udp

ip地址

端口

字节序

步骤

 API介绍

地址转换API

实战  聊天对话框

服务器  运行时后面要传IP地址和端口

客户端   运行时后面要传IP地址和端口


socket套接字网络通信学习

数据协议

socket是网络通信,通信的数据协议有http、tcp、udp等等,简单来说就是传输数据的格式,常用的是tcp和udp

tcp

  1. 简单来说就是两个人进行打电话,a和b打电话的意思,要别人接通才可以立刻收到消息进行交流,所以是可靠的,多用在精准控制,要保证传输数据的准确性,所以tcp连接传数据无差错,不丢失,不重复,且有序
  2. tcp是面向字节流,实际上是tcp把数据看成一连串无结构的字节流,是全双工的可靠信道
  3. tcp只支持一对一通信
  4. tcp首部开销20字节

udp

  1. 简单来说就是两个人进行发短信,a给b发短信的意思,a不知道b有没有收到,可以不用和b建立通道才发送数据,所以是不可靠的,但udp也不是没有用,因为你要发送视频或者比较大的数据,就可以用到udp,可能中途会有些丢包,但大部分是完整的,视频出现一些小黑点我们也看不见
  2. udp是面向报文,udp没有堵塞拥挤,对网络视频那些会有好处,是不可靠信道
  3. udp支持一对一,一对多,多对一,多对多通信
  4. udp首部开销8个字节

要网络通信,那少不了的就是IP地址和端口号,ip地址是你与谁的机子通信,端口是指机子里的哪个服务通信,一台机子有很多端口

ip地址

  1. ip地址是你的电脑连上wifi,就会分到一个属于自己的ip地址,属于同一个网络下,就可以与另一个ip地址进行通信

端口

  1. 端口简单来说就是服务,一台电脑有很多服务,比如web、ftp、smtp等等,
  2. 别人来找你通信,你ip只有一个,网页又需要通信,vx也要通信,别人发来的数据谁来接收呢,所以一台电脑会分配许多端口来给每个需要通信的服务进行交流,
  3. 简单来说银行就是ip地址,你进去存钱,你就要进到银行里面的某个窗口办理
  4. 实际上是通过 “ IP地址 + 端口号 ” 来区分服务的
  5. 端口提供了一种访问通道,服务器一般是通过知名的端口号来识别,一般某个服务就指定了某个端口,例如ftp服务是21号端口,telnet服务器的端口是23,tftp服务器的端口是69 

字节序

字节序是指多字节数据在计算机内存存储或者网络传输时各个字节的存储顺序

  1. LIttle endian 小端字节序
  2. Big endian 大端字节序 (网络字节序)

例如存储0x01 0x02 0x03 0x04这四个数据到为 2000 2001 2002 2003这四个地址里

  • 小端存储是 2003--0x01 2002--0x02 2001--0x03 2000--0x04
  • 大端存储是 2000--0x01 2001--0x02 2002--0x03 2003--0x04

我们将0x1234abcd写入到以0x0000开始的内存中

  •           Big endian  LIttle endian
  • 0000        0x12        0xcd
  • 0001        0x34        0xab
  • 0002        0xab        0x34
  • 0003        0xcd        0x12

步骤

我们只需要调用socket的api进行通信就可以,api会调用内核帮我们实现文章来源地址https://www.toymoban.com/news/detail-753280.html

  1. tcp server步骤
    1. 先建立socket套接字,返回网络描述符,后面会用到
    2. 进行bind连接,在用之前要为套接字添加信息(IP地址和端口)
    3. listen监听,监听网络连接,监听是否有人连接
    4. accept接入,监听到有人接入,就接受一个连接
    5. 数据交流read,write
    6. close关闭套接字,断开连接
  2. tcp client步骤
    1. 先建立socket套接字,返回网络描述符,后面会用到
    2. connect连接,连接前要知道IP地址和端口
    3. 数据交流read,write
    4. close关闭套接字,断开连接

 API介绍

  • 头文件
    • #include <sys/types.h>
    • #include <sys/socket.h>
  • int socket(int domain,int type, int protocol)
    • 一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数
    • 返回值:非负描述符 – 成功,-1--出错树莓派socket,树莓派学习,linux学习,学习
  • int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen)树莓派socket,树莓派学习,linux学习,学习树莓派socket,树莓派学习,linux学习,学习
  • int listen(int sockfd,int backlog)树莓派socket,树莓派学习,linux学习,学习
  • int connect(int sockfd,conststruct sockaddr *addr, socklen_t addrlen)树莓派socket,树莓派学习,linux学习,学习
  • int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)树莓派socket,树莓派学习,linux学习,学习
  • ssize_t send(int sockfd,constvoid *buf, size_t len,int flags)树莓派socket,树莓派学习,linux学习,学习
  • ssize_t sendto(int sockfd,const void *buf, size_t len,int flags,const struct sockaddr *dst_addr, socklen_t addrlen)  主要用于udp树莓派socket,树莓派学习,linux学习,学习
  • ssize_t recv(int sockfd,void *buf, size_t len,int flags)树莓派socket,树莓派学习,linux学习,学习
  • ssize_t recvfrom(int sockfd,void *buf, size_t len,int flags,struct sockaddr *src_addr, socklen_t *addrlen)   主要用于udp树莓派socket,树莓派学习,linux学习,学习
  • read  write树莓派socket,树莓派学习,linux学习,学习

地址转换API

  • int inet_aton(const char* straddr , struct in_addr *addrp);
    • 把字符串形式的“xxx.xxx.xxx.xxx”转为网络识别模式
  • char* inet_ntoa(struct in_addr inaddr);
    • 把网络识别模式转为字符串形式的“xxx.xxx.xxx.xxx”

实战  聊天对话框

服务器  运行时后面要传IP地址和端口

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char **argv)
{
	int s_fd;//服务端描述符
	int c_fd;//客户端描述符
	int n_read;//读了多少字节
	char readBuf[128];//收到的数据缓存
	
	int mark = 0;//记录第几个连接标识符
	char msg[128] = {0};//发送的数据缓存
	struct sockaddr_in s_addr;//自己服务端的协议机构提
	struct sockaddr_in c_addr;//已连接的客户端的协议结构体
 	//如果后面没有两个参数,退出
	if(argc != 3){
		printf("param is not good\n");
		exit(-1);
	}
 
	memset(&s_addr,0,sizeof(struct sockaddr_in));//
	memset(&c_addr,0,sizeof(struct sockaddr_in));//
 
	//1. 创建socket   AF_INET为ipv4协议    SOCK_STREAM为面向连接的通信流,tcp协议,0是自动匹配对应协议
	s_fd = socket(AF_INET, SOCK_STREAM, 0);
	if(s_fd == -1){
		perror("socket");
		exit(-1);
	}
 	
	s_addr.sin_family = AF_INET;//记录上面的协议族ipv4协议
	s_addr.sin_port = htons(atoi(argv[2]));//将字符串端口号转为数字然后转为网络字符
	inet_aton(argv[1],&s_addr.sin_addr);//将ip地址转为网络字符放到sin_addr里
 
	//2. bind连接   s_fd是socket描述符     &s_addr是存放socket信息的结构体          sizeof...是结构体的大小
	bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
 
	//3. listen监听   s_fd是socket描述符 10是最多有十个人同时连接
	listen(s_fd,10);
	//4. accept接入
	int clen = sizeof(struct sockaddr_in);//是存放socket信息的结构体的大小
	while(1){
 		//  s_fd是socket描述符      &c_addr是已连接的客户端的协议结构体                &clen是存放socket信息的结构体的大小
		c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
		if(c_fd == -1){
			perror("accept");
		}
 
		mark++;//记录第几个连接标识符
		printf("get connect: %s\n",inet_ntoa(c_addr.sin_addr));//打印客户端的IP地址
		//创建线程
		if(fork() == 0){
 			//write写
			if(fork()==0){//子线程一直循环发送第几个连接对象,等于心跳包
				while(1){
					sprintf(msg,"welcom No.%d client",mark);
					write(c_fd,msg,strlen(msg));//向描述符发送msg消息
					sleep(3);
				}	
			}	
 
			//5. read读
			while(1){
				memset(readBuf,0,sizeof(readBuf));//清空收到的数据
				n_read = read(c_fd, readBuf, 128);//接收描述符对应的socket消息,放到readbuf里,最大读128字节
				if(n_read == -1){//等于-1 表示读取错误
					perror("read");
				}else if(n_read>0){//大于0 表示读到数据  并打印出来
					printf("\nget: %d\n",n_read);
				}else{//其他的表示客户端退出
					printf("client quit\n");
					break;
				}
			}
			break;
		}
 
	}
	return 0;
}

客户端   运行时后面要传IP地址和端口

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

int main(int argc, char **argv)
{
	int c_fd;//客户端描述符
	int n_read;//读了多少字节
	char readBuf[128];//收到的数据缓存
	int tmp;//

	char msg[128] = {0};//发送的数据缓存
	struct sockaddr_in c_addr;//客户端的协议结构体

	memset(&c_addr,0,sizeof(struct sockaddr_in));

	if(argc != 3){
		printf("param is not good\n");
		exit(-1);
	}

	printf("%d\n",getpid());//打印当前进程的进程ID
	//1. socket AF_INET为ipv4协议    SOCK_STREAM为面向连接的通信流,tcp协议,0是自动匹配对应协议
	c_fd = socket(AF_INET, SOCK_STREAM, 0);
	if(c_fd == -1){
		perror("socket");
		exit(-1);
	}

	c_addr.sin_family = AF_INET;//记录上面的协议族ipv4协议
	c_addr.sin_port = htons(atoi(argv[2]));//将字符串端口号转为数字然后转为网络字符
	inet_aton(argv[1],&c_addr.sin_addr);//将ip地址转为网络字符放到sin_addr里

	//2.connect	 c_fd是socket描述符     &c_addr是存放socket信息的结构体          sizeof...是结构体的大小
	if(connect(c_fd, (struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
		perror("connect");
		exit(-1);
	}
	while(1){

		if(fork()==0){//子线程
			while(1){//不断获取来自键盘的消息并且发送出去
				memset(msg,0,sizeof(msg));
				printf("input: ");
				gets(msg);//
				write(c_fd,msg,strlen(msg));//向描述符发送msg消息
			}
		}

		while(1){//
			memset(readBuf,0,sizeof(readBuf));
			n_read = read(c_fd, readBuf, 128);//接收描述符对应的socket消息,放到readbuf里,最大读128字节
			if(n_read == -1){
				perror("read");//等于-1 表示读取错误
			}else{
				printf("\nget:%s\n",readBuf);//大于0 表示读到数据  并打印出来
			}
		}
	}

	return 0;
}

到了这里,关于树莓派学习:建立socket进行网络通信+tcp+udp+端口+字节序+socketAPI+地址转换API+聊天对话框实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++实现socket网络通信

    🍺SOCKET网络通信系列文章链接如下:🍺 🎈【小沐学python】(一)Python简介和安装🎈 🎈Python实现socket网络通信🎈 🎈C++实现socket网络通信🎈 🎈Android实现socket网络通信🎈 🎈nodejs实现socket网络通信🎈 《斗诗篇》 陈献章: 窗外竹青青,窗间人独坐。 究竟竹与人,原来无两

    2023年04月09日
    浏览(23)
  • 【网络】socket——TCP网络通信 | 日志功能 | 守护进程

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 上篇文章中本喵介绍了UDP网络通信的socket代码,今天介绍TCP网络通信的socket代码。 和 udp 的网络通信一样, tcp 通信也需要服务器指定端口号,IP地址同样使用 0.0.0.0 ,以便客户端所有对服

    2024年02月16日
    浏览(28)
  • 网络通信(Socket/TCP/UDP)

    Socket(又叫套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接协议,客户端的IP地址,客户端的端口,服务器的IP地址,服务器的端口。 一个Socket是一对IP地址和端口。 Socket可以看

    2024年01月22日
    浏览(43)
  • 【网络】socket——预备知识 | 套接字 | UDP网络通信

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 在前面本喵对网络的整体轮廓做了一个大概的介绍,比如分层,协议等等内容,现在我们直接进入socket(套接字)编程,先来感受到网络编程。 我们知道,在网络通信中,存在两套地址,一

    2024年02月13日
    浏览(35)
  • 网络编程之简单socket通信

    Socket,又叫套接字,是在应用层和传输层的一个抽象层。它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。  socket分为流socket和数据报socket,分别基于tcp和udp实现。 SOCK_STREAM 有以下几个特征: 数据在传输过程中不会消失; 数据是按照顺序

    2024年02月01日
    浏览(31)
  • 基于python的socket网络通信【1】

    学习了大佬的知识,简单记一些笔记 https://www.jianshu.com/p/066d99da7cbd http://c.biancheng.net/view/2351.html 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算

    2024年02月02日
    浏览(28)
  • 【网络通信】socket编程——TCP套接字

    TCP依旧使用代码来熟悉对应的套接字,很多接口都是在udp中使用过的 所以就不会单独把他们拿出来作为标题了,只会把第一次出现的接口作为标题 通过TCP的套接字 ,来把数据交付给对方的应用层,完成双方进程的通信 在 tcpServer.hpp 中,创建一个命名空间 yzq 用于封装 在命名

    2024年02月13日
    浏览(29)
  • 【Unity】Socket网络通信(TCP) - 最基础的客户端通信流程

    这篇文章主要内容是客户端与服务器通信的内容,服务端代码可以看我的这一篇文章【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程 客户端与服务器的整个流程比较相似,客户端会更加简单一些: 创建socket 连接服务器 收发消息 释放socket,关闭连接 和服务端创建

    2024年02月03日
    浏览(32)
  • C++网络编程(一)本地socket通信

    本次内容简单描述C++网络通信中,采用socket连接客户端与服务器端的方法,以及过程中所涉及的函数概要与部分函数使用细节。记录本人C++网络学习的过程。 socket,即“插座”,在网络中译作中文“套接字”,应用于计算机网络建立起数据连接。基于TCP/IP协议进行通信,将本地的

    2024年02月15日
    浏览(31)
  • 【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程

    我这里新建了一个C#控制台项目来写服务端代码。 下面是基于C# Socket的最基础服务端通信流程: 创建服务端Socket对象 绑定IP地址和端口 设置最大监听客户端数量 等待客户端连接 收发消息 释放连接 基于上面流程就能实现一个最简单并且能和客户端通信的服务器程序,每个步

    2023年04月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包