socket通信基础

socket是套接字,通过套接字,进行网络数据的收和发
套接字就像网络中的“手机”   套接字是网络数据传输用的软件设备

errno获得出现的错误

 

既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux 系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。

 

bind函数  把套接字和一个地址相关联

 listen函数 

connect函数(客户端)

 

 

 

 

 

主机字节序列和网络字节序列

大端序  小端序

网络协议指定了字节序, 因此异构计算机系统能够交换协议信息而不会被字节序所混淆。 TCP/IP协议栈使用大端字节序。应用程序交换格式化数据时,字节序问题就会出现。对千TCP/IP, 地址用网络字节序来表示,所以应用程序有时需要在处理器的字节序与网络字节序之间转换它们。 例如, 以一种易读的形式打印一个地址时, 这种转换很常见。

地址格式

一个地址标识一个特定通信域的套接字端点, 地址格式与这个特定的通信域相关。 为使不同格式地址能够传入到套接字函数, 地址会被强制转换成一个通用的地址结构sockaddr:

 在1Pv4因特网域(AF_INET)中, 套接字地址用结构sockaddr_in表示:

注意, 尽管sockaddr_in 与sockaddr_in6 结构相差比较大, 但它们均被强制 转换成 sockaddr结构输入到套接字例程中 

14 字节的 sa_data 根本无法容纳多数协议族的地址值。因此,Linux 定义了下面这个新的通用的 socket 地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的

#include <bits/socket.h>
struct sockaddr_storage
{
sa_family_t sa_family;
unsigned long int __ss_align;
char __ss_padding[ 128 - sizeof(__ss_align) ];
};
typedef unsigned short int sa_family_t;

专用 socket 地址

*
sin_family: 地址族 AF_INET
sin_port: 端口号,需要用网络字节序表示
sin_addr: IPV4 地址结构:s_addr 以网络字节序表示 IPV4 地址
*/

struct in_addr
{
	u_int32_t s_addr;
};

struct sockaddr_in//IPV4 
{
	sa_family_t sin_family;
	u_int16_t sin_port;
	struct in_addr sin_addr;
};

struct in6_addr
{
	unsigned char sa_addr[16]; // IPV6 地址,要用网络字节序表示 };

	struct sockaddr_in6
	{
		sa_family_t sin6_family; // 地址族:AF_INET6
		u_inet16_t sin6_port; // 端口号:用网络字节序表示
		u_int32_t sin6_flowinfo; // 流信息,应设置为 0
		struct in6_addr sin6_addr; // IPV6 地址结构体
		u_int32_t sin6_scope_id; // scope ID,尚处于试验阶段
	};

 

posted @ 2021-09-24 01:06  wsq1219  阅读(42)  评论(0编辑  收藏  举报