13.1 Linux_网络编程_TCP/UDP

字节序

1、概述

什么是字节序:

字节序就是字节的存储顺序,分为大端字节序和小端字节序。

  • 大端字节序:低地址存高位(网络)
  • 小端字节序:低地址存低位(主机)

检验主机字节序模式:

#include <stdio.h>

int main(){

	unsigned int a = 0x11223344;
	unsigned char b = *((unsigned char *)&a);

	if(b == 0x44){
		printf("小端字节序\n");
	}else{
		printf("大端字节序\n");
	}
	return 0;
}

2、字节序转换

2.1 端口号字节序转换函数

因为主机使用的是小端字节序,网络使用的是大端字节序,因此在数据传输时,需要先将数据转换为大端字节序传给网络,之后再将数据转换为小端字节序传给另一个主机。

/* h:本机 n:网络 l:32位 s:16位 */

//32位数据(4字节)
uint32_t htonl(uint32_t hostlong);//本机->网络
uint32_t ntohl(uint32_t netlong);//网络->本机
//16位数据(2字节)
uint16_t htons(uint16_t hostshort);//本机->网络
uint16_t ntohs(uint16_t netshort);//网络->本机

返回值:将小端字节序转换为大端字节序后的端口号

参数:端口号值 

2.2 IP地址字节序转换函数

该函数主要是实现点分十进制表示的IP地址转换,而不需要一个字节一个字节的去转换。

2.2.1 IPv4
//点分十进制字符串->网络字节序
in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);
//网络字节序->点分十进制字符串
char *inet_ntoa(struct in_addr in);

inet_addr返回值:ip地址

cp:点分十进制字符串,例如传入"192.168.1.1"这个字符串

inp:ip地址

inet_ntoa返回值:点分十进制字符串

in:ip地址

2.2.1 IPv6
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

套接字socket

概述

socket多种含义:

  • 应用编程接口API:socket API,简称socket。 
  • 函数名:socket API中有一个名为socket的函数
  • 端点:比如TCP连接是有两个端点,这两个端点是一对一通信的关系。这个端点也叫socket
  • 文件描述符:socket函数的返回值是一个socket描述符,简称socket

socket的作用:

socket处在应用层与内核之间。在应用层中实现的是与应用相关的代码,在内核中实现的是网络通信相关的代码。在OSI结构中,应用层就是OSI的应用层、表示层、会话层,内核就是运输层、网络层、数据链路层、物理层。

什么是三元组:

三元组指的是IP地址、端口号、协议。该数据通过bind函数进行绑定。

  • IP地址:标识计算机,找到与网络中的哪一个计算机进行通信。
  • 端口号:标识进程,找到与计算机中哪一个进程进行通信。
  • 协议:指定数据以什么样的方式进行传递。主要指TCP、UDP

套接字的类型:

  • 流式套接字 (SOCK_STREAM) :提供可靠的、面向连接的通信流;它使用TCP,从而保证数据传输的可靠性和顺序性
  • 数据报套接字 (SOCK_DGRAM) :定义了一种不可靠、面向无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP
  • 原始套接字(SOCK_RAW) :允许直接访问底层协议,如IP或ICMP,它功能强大但使用较为不便,主要用于协议开发。

socket文件的读写含义:

socket在Linux中也是一种文件,对socket文件进行读就是读取网络传输过来的数据,对socket文件进行写就是向网络中传输相应的数据。

相关函数 

socket相关API:

创建套接字、绑定通信结构体、监听套接字、接收套接字、发起连接

通用 

1、创建套接字
int socket(int domain, int type, int protocol);

返回值:成功返回socket文件描述符,失败返回-1

domain:指定bind中传入的地址族结构体的类型,与sa_family_t的取值要一致。

domain值 含义
AF_UNIX UNIX 域套接字地址族,用于在同一台主机上的进程间通信
AF_INET IPv4 地址族,用于 IPv4 通信
AF_INET6 IPv6 地址族,用于 IPv6 通信

type:套接字的类型,就是"概述"中的说的三种类型

type值 使用的协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值