网络编程---TCP/UDP套接字编程原理
本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的
本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现
介绍
- 网络编程套接字(socket)也是进程间通信的一种方式,但是不同于管道,消息队列,共享内存的是socket不仅可以实现本机内不同进程间的通信,也可以实现网络中两台不同主机间的进程通信。
socket相当于是一个文件描述符,我们将数据写入socket中,再发到目标主机,目标主机接收socket,再从socket中读取数据,至此便实现了网络中两台主机间的数据传输,即进程通信。
举个栗子:如果是两个人进行通信的话,首先要知道彼此的电话号码,而且要明确两个人谈论的事项,即使是闲聊也算生活事项的一种。网络中的两台主机进行通信也是如此,电话号码即彼此的ip地址,谈论的事项即彼此主机上确定的一个端口号
解释ip地址+端口号
网络编程套接字可以看做是ip地址+端口号,ip地址为了明确网络中唯一一台主机,而端口号确定了这台主机上的唯一一个进程,因为一个端口号只能被一个进程占用,而且只有网络进程才有端口号。
IP地址
IP协议有两个版本,IPv4和ipv6,现在普遍用的都是IPv4,IPv6是为了解决现有的IP地址可能不够的情况,但还没有普及开来。我们接下来使用的全是IPv4协议。
- IP地址是在IP协议中,用来标识网络中不同主机的地址;
- 对于IPv4来说,IP地址是一个4字节,32位的整数;
- 我们通常也使用“点分十进制”的字符串标识IP地址,例如192.168.0.1;用点分割的每一个数字表示一个字节,范围是0~255。
端口号
端口号是传输层协议的内容
- 端口号是一个2字节16位的整数;
- IP地址+端口号用来标识网络中某一台主机上的唯一一个进程;
- 一个端口号只能被一个进程占用,只有网络进程才有端口号。
网络字节序
大家可能刚看到这个觉得有点陌生,我来为大家解释一下。
我们都知道我们的计算机存储数据时是分大端和小端的,而且主机和主机之间的存储模式是不固定的,也就是没有统一的标准,即如果你是大端的模式,而对方却是小端的模式,你们在交换数据时就会发生错误,所以为了避免差异化,TCP/IP协议规定,网络数据流应采用大端字节序,即低地址存放数据的高字节。
无论当前主机是大端机还是小端机,是发送端还是接收端,都要按照这个TCP/IP协议规定的网络字节序来处理数据,如果当前发送主机是小端。则需要先将数据转成大端;否则就忽略,直接发送即可;
调用以下库函数可以实现网络字节序和主机字节序之间的转换
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);
//将32位的长整数从主机字节序转换位网络字节序
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
- h表示host,n表示network,l表示32位长整数,s表示16位短整数。
- 如果主机是小端字节序,则函数内部会转换成大端,如果主机是大端,则函数内部不做转换
socket编程接口
socket常用API
//创建 socket 文件描述符(TCP/UDP, 客户端 + 服务器)
//domain: 一个地址描述。目前仅支持AF_INET,,代表sockaddr_in结构体
//type: 服务类型,UDP为SOCK_DGRAM, TCP为SOCK_STREAM
//protocol: 套接口所用的协议。如调用者不想指定,可用0指定,表示缺省。
int socket (int domain, int type, int protocol);//绑定端口号(TCP/UDP, 服务器)
//客户端不用该接口,而且对于服务器而言,端口号必须是众所周知,不可修改的
int band (int socket, const struct sockaddr *address, socklen_t address_len);//开始监听 socket(TCP, 服务器)
//作用:将套接字由新创建状态设置为监听状态,即监听是否有客户端请求连接
//backlog: 监听队列,不要设置的太大,5~10就差不多了,避免浪费资源
int listen(int socket, int backlog);//接受请求(TCP, 服务器)
//与客户端连接成功后,返回一个用于服务的文件描述符,也可以当做是客户端的文件描述符,用于写入和读取数据
//否则进行阻塞式等待,失败返回-1
int accept (int socket, struct sockaddr* address, socklen_t* address_len);//建立连接(TCP, 客户端)
int connect (int socket,const struct sockaddr* address, socklen_t addrlen);
sockaddr结构
socket常见API中经常出现sockaddr*
,下面就为大家详解该结构体的作用以及用法 .
sockaddr用于存储参与套接字通信的一个计算机上的IP协议地址。为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind()、connect()、recvfrom()、sendto()等函数调用。
但一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。
- sockaddr
struct sockaddr {unsigned short sa_family; //:是2字节的地址家族,一般都是“AF_xxx”的形式,通常用AF_INETchar sa_data[14]; //14字节的地址数据}
- sockaddr_in
struct sockaddr_in {short int sin_family; /* Address family */unsigned short int sin_port; /* Port number */struct in_addr sin_addr; /* Internet address */unsigned char sin_zero[8]; /* Same size as struct sockaddr */};//sin_family:指代协议族,在socket编程中只能是AF_INET//sin_port:存储端口号(使用网络字节顺序)//sin_addr:存储IP地址,使用in_addr这个数据结构//sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
- sockaddr_in 中的 in_addr
typedef struct in_addr {union {struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;struct{ unsigned short s_w1, s_w2;} S_un_w;unsigned long S_addr;} S_un;} IN_ADDR;
阐述下in_addr的含义,很显然它是一个存储ip地址的共用体有三种表达方式:
第一种用四个字节来表示IP地址的四个数字;
第二种用两个双字节来表示IP地址;
第三种用一个长整型来表示IP地址。
给in_addr赋值的一种最简单方法是使用inet_addr函数,它可以把一个代表IP地址的字符串赋值转换为in_addr类型,如addrto.sin_addr.s_addr=inet_addr(“192.168.0.2”);
其反函数是inet_ntoa,可以把一个in_addr类型转换为一个字符串。
网络编程---TCP/UDP套接字编程原理相关推荐
- 【Linux网络编程】UDP 套接字编程
[Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...
- 计网实验原理-TCP/UDP套接字编程
计算机网络自顶向下结构--第7版 第二章实验,套接字编程 代码运行环境:window10,python 3.8.对于书上代码略作修改. 进程与计算机网络之间的接口 多数应用程序是由通信进程队组成的,每 ...
- TCP和UDP套接字编程
一.Socket简单介绍 如果要在应用层调用传输层的服务,进行相关程序的设计,就要涉及到套接字编程.套接字也称之为Socket,本质上它就是利用传输层提供的一系列Api来进行网络应用程序的设计. 网络 ...
- 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程
文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...
- 《网络编程》基本 UDP 套接字编程
在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 ...
- 网络编程学习笔记-套接字编程-socket
本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写 前置概念详见 本文目录 概念 基本TCP套接字编程 通信循环 半链接池 链接循环 udp协议 基于TCP协议实现远程执行客户端请 ...
- UDP套接字编程——Python语言描述
首先,回顾一下.在我们使用Socket编程之前的一些网络的概念. IP:它是用来标识处于Internet之中的端系统的. MAC:它是用于在同一局域网中标识不同的计算机的. 端口号:它是用来标识同一台 ...
- 计算机网络实验二:UDP套接字编程实现多人聊天
一.实验目的 1. 实现一个能够在局域网中进行点对点聊天的实用程序. 2. 熟悉c++.Java等高级编程语言网络编程的基本操作. 3. 基本了解对话框应用程序的编写过程. 4. 实现UDP套接字编程 ...
- Linux IPv6 UDP套接字编程示例
udp ipv6套接字编程和ipv4接口类似,参数略有不同,流程都包括创建套接字.绑定地址.发送等. 下面是一个udp ipv6 demo, 包括创建ipv6套接字.绑定地址和发送数据等. 首先先在l ...
最新文章
- IIS6的PHP最佳配置方法
- English Speech-Graduation from University
- Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)
- 使用excel批量创建android联系人
- 闪烁点击效果css,CSS3自定义闪烁动画效果实例
- µVISION: Error: Encountered an improper argument
- java finereport_java报表工具FineReport常见的数据集报错错误代码和解释
- html5 css登录注册实现,html5+css3实现一款注册表单实例
- 互联网晚报 | 12月6日 星期一 | 荣耀线下门店超3万家;鸿蒙系统明年正式登陆欧洲;凯撒旅业与众信旅游终止合并...
- 送书 | 获得诺贝尔奖之后影响力会下降?绘制精英科学家的职业生涯路线图
- EM算法【图像迭代】
- VMware专家:行动起来 狙击云炒作
- python字典是什么数据_python---基本数据类型 dict(字典)
- 前端学习之HTML基本标签介绍
- 粒子群优化算法(1)
- python爬虫案例——百度贴吧数据采集
- python生成热度图_python根据输入的数据在地图上生成热力图效果
- 21种常见产品的电磁兼容检测项目与检测标准
- win10录屏软件用什么好?分享:一款win10支持的录屏软件,超好用
- 【工具】百度云破解版不用会员高速下载 分享