【网络】网络套接字:UDP/TCP -socket编程


一、网络套接字

  • 在Linux中,Socket(套接字)表示进程间网络通信的特殊文件类型;

  • 本质为内核借助缓冲区形成的伪文件;

    与管道类似,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。

  • 在TCP/IP协议中,IP地址+TCP/UDP端口号唯一标识网络通讯中的一个进程,因此IP地址+端口号就对应一个socket文件;

  • 一个socket文件应当含有网络数据的五元组信息;
    在这里插入图片描述

  • 若要实现一个可以网络通信的进程,就绪要提前定义该进程的socket文件;


二、网络数据字节序

1、字节序是什么

  • 字节序就是一个设备将(大于一个字节类型的)数据存放在内存中的顺序;
    在这里插入图片描述

2、如何判断自己主机的字节序是大端or小端?

联合体判断

// 判断主机字节序
// 大多主机均为小端机
void byteOrder()
{
	// 利用联合体特性查看
	// 联合体成员共用同一块空间
	union MyUnion
	{
		unsigned char a;  //该联合体对象的前一个字节
		unsigned int b;   //该联合体对象共四个字节
	};
	MyUnion u;
	u.b = 0x12345678;
	if (u.a == 0x78)
	{
		cout << "小端" << endl;
	}
	else if (u.a == 0x12)
	{
		cout << "大端" << endl;
	}
}

在这里插入图片描述

3、网络中的字节序

  • 网络就是一种跨设备的进程通信机制,但不同设备有着不同的字节序类型(主机字节序),为保证数据在网络中的准确传输,规定传送至网络的数据必须是大端字节序(网络字节序);
    在这里插入图片描述

  • 在编写套接字socket文件时,五元组信息中的IP和端口号,必须经过字节序转换,数据内容可不转换;

    因为在网络传输过程中,大多结点均需使用IP和端口号,而数据内容只有源主机和目的主机才会查看具体内容,且大多主机均为小端机,因此数据可不转换至网络字节序;


4、主机字节序和网络字节序的转换

  • Linux socket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换:
#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);		//把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort);		//把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong);		//把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort);		//把uint16_t类型从网络序转换到主机序
  • IP为4字节,端口号为2字节,因此:
    在这里插入图片描述

三、UDP-socket编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值