本篇介绍的是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套接字编程原理相关推荐

  1. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

  2. 计网实验原理-TCP/UDP套接字编程

    计算机网络自顶向下结构--第7版 第二章实验,套接字编程 代码运行环境:window10,python 3.8.对于书上代码略作修改. 进程与计算机网络之间的接口 多数应用程序是由通信进程队组成的,每 ...

  3. TCP和UDP套接字编程

    一.Socket简单介绍 如果要在应用层调用传输层的服务,进行相关程序的设计,就要涉及到套接字编程.套接字也称之为Socket,本质上它就是利用传输层提供的一系列Api来进行网络应用程序的设计. 网络 ...

  4. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  5. 《网络编程》基本 UDP 套接字编程

    在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 ...

  6. 网络编程学习笔记-套接字编程-socket

    本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写 前置概念详见 本文目录 概念 基本TCP套接字编程 通信循环 半链接池 链接循环 udp协议 基于TCP协议实现远程执行客户端请 ...

  7. UDP套接字编程——Python语言描述

    首先,回顾一下.在我们使用Socket编程之前的一些网络的概念. IP:它是用来标识处于Internet之中的端系统的. MAC:它是用于在同一局域网中标识不同的计算机的. 端口号:它是用来标识同一台 ...

  8. 计算机网络实验二:UDP套接字编程实现多人聊天

    一.实验目的 1. 实现一个能够在局域网中进行点对点聊天的实用程序. 2. 熟悉c++.Java等高级编程语言网络编程的基本操作. 3. 基本了解对话框应用程序的编写过程. 4. 实现UDP套接字编程 ...

  9. Linux IPv6 UDP套接字编程示例

    udp ipv6套接字编程和ipv4接口类似,参数略有不同,流程都包括创建套接字.绑定地址.发送等. 下面是一个udp ipv6 demo, 包括创建ipv6套接字.绑定地址和发送数据等. 首先先在l ...

最新文章

  1. IIS6的PHP最佳配置方法
  2. English Speech-Graduation from University
  3. Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)
  4. 使用excel批量创建android联系人
  5. 闪烁点击效果css,CSS3自定义闪烁动画效果实例
  6. µVISION: Error: Encountered an improper argument
  7. java finereport_java报表工具FineReport常见的数据集报错错误代码和解释
  8. html5 css登录注册实现,html5+css3实现一款注册表单实例
  9. 互联网晚报 | 12月6日 星期一 | 荣耀线下门店超3万家;鸿蒙系统明年正式登陆欧洲;凯撒旅业与众信旅游终止合并...
  10. 送书 | 获得诺贝尔奖之后影响力会下降?绘制精英科学家的职业生涯路线图
  11. EM算法【图像迭代】
  12. VMware专家:行动起来 狙击云炒作
  13. python字典是什么数据_python---基本数据类型 dict(字典)
  14. 前端学习之HTML基本标签介绍
  15. 粒子群优化算法(1)
  16. python爬虫案例——百度贴吧数据采集
  17. python生成热度图_python根据输入的数据在地图上生成热力图效果
  18. 21种常见产品的电磁兼容检测项目与检测标准
  19. win10录屏软件用什么好?分享:一款win10支持的录屏软件,超好用
  20. 【工具】百度云破解版不用会员高速下载 分享

热门文章

  1. Keras中Conv1D和Conv2D的区别
  2. windows.edb文件过大,导致c盘空间极小问题
  3. 虚拟机下 ubuntu 显示屏幕太小问题
  4. 计算文本大小,将汉字转拼音
  5. 基于CentOs下的Hadoop完全分布式集群环境搭建
  6. 计算机基础知识(基础入门小白专属)三
  7. 最新!Xmind2020安装教程
  8. SSM 实战项目遇到的问题
  9. PIC18F66K80存储器构成(详解)
  10. adobe pdf 高级搜索功能