Socket网络编程
一、Socket简介
1、网络中进程间通信
本机进程使用进程号来区分不同的进程。进程间的通信方式有管道、信号、消息队列、共享内存、信号量等。
而网络中进程间通信,首先需要知道进程所在的主机,即网络中唯一的标识即网络层的IP地址,主机上的进程可以通过传输层的协议和端口号识别。
2、Socket原理
Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,是一种编程接口。Socket屏蔽了不同网络协议的差异,支持面向连接(TCP)和无连接(UDP)。
二、Socket编程的基础知识
1、网络字节序
字节序在内存中存储的方式有大端序(网络序)和小端序(主机序)。
大端序:将高字节存储在低地址。
小端序:将低字节存储在低地址。
1 | // 此程序用于判断本机的字节序 |
网络中在处理多字节时一般采用大端序,在网络传输中需要把主机字节序转换到网络字节序。常用的的转换函数如下:
1 |
|
2、sockaddr结构体
存放协议族、端口和地址信息,客户端的connect()函数和服务端的bind()函数需要这个结构体。
1 | struct sockaddr { |
3、sockaddr_in结构体
sockaddr结构体是为了统一地址结构的表示方法,统一接口函数,但是,操作不方便。所以定义了等价的sockaddr_in 结构体,它的大小与sockaddr相同,实际使用可以强制转换成sockaddr。
1 | struct sockaddr_in { |
4、字符串IP与大端序IP的转换
C语言提供了几个库函数,用于字符串格式的IP和大端序IP的互相转换,用于网络通讯的服务端程序中。
1 | typedef unsigned int in_addr_t;// 32 位大端序的 IP 地址。 |
三、Socket网络编程的流程
四、代码
客户端代码
1 | //此程序用于演示socket通讯的客户端。 |
服务端代码
1 | //此程序用于演示socket通讯的服务端。 |