Linux 下的 Socket 编程
什么是 Socket
Socket 接口是 TCP/IP 网络的 API,Socket 接口定义了许多函数或例程,程
序员可以用它们来开发 TCP/IP 网络上的应用程序。要学 Internet 上的 TCP/IP
网络编程,必须理解 Socket 接口。
Socket 接口设计者最先是将接口放在 Unix 操作系统里面的。如果了解 Unix
系统的输入和输出的话,就很容易了解 Socket 了。网络的 Socket 数据传输是一
种特殊的 I/O,Socket 也是一种文件描述符。Socket 也具有一个类似于打开文
件的函数调用 Socket(),该函数返回一个整型的 Socket 描述符,随后的连接建
立、数据传输等操作都是通过该 Socket 实现的。常用的 Socket 类型有两种:流
式 Socket (SOCK_STREAM)和数据报式 Socket(SOCK_DGRAM)。流式是一种面
向连接的 Socket,针对于面向连接的 TCP 服务应用;数据报式 Socket 是一种无
连接的 Socket,对应于无连接的 UDP 服务应用。
Socket 建立
为了建立 Socket,程序可以调用 Socket 函数,该函数返回一个类似于文件
描述符的句柄。socket 函数原型为:
int socket(int domain, int type, int protocol);
domain 指明所使用的协议族,通常为 PF_INET,表示互联网协议族(TCP/IP
协议族);type 参数指定 socket 的类型: SOCK_STREAM 或 SOCK_DGRAM,Socket
接口还定义了原始 Socket(SOCK_RAW),允许程序使用低层协议;protocol 通
常赋值 "0"。 Socket()调用返回一个整型 socket 描述符,你可以在后面的调用
使用它。
Socket 描述符是一个指向内部数据结构的指针,它指向描述符表入口。调
用 Socket 函数时,socket 执行体将建立一个 Socket,实际上 "建立一个 Socket"
意味着为一个 Socket 数据结构分配存储空间。Socket 执行体为你管理描述符表。
两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、
本地主机端口、远端主机地址和远端协议端口。Socket 数据结构中包含这五种
信息。
Socket 配置
通过 socket 调用返回一个 socket 描述符后,在使用 socket 进行网络传输
以前,必须配置该 socket。面向连接的 socket 客户端通过调用 Connect 函数在
socket 数据结构中保存本地和远端信息。无连接 socket 的客户端和服务端以及
面向连接 socket 的服务端通过调用 bind 函数来配置本地信息。
Bind 函数将 socket 与本机上的一个端口相关联,随后你就可以在该端口监听服
务请求。Bind 函数原型为:
int bind(int sockfd,struct sockaddr *my_addr, int addrlen);
Sockfd 是调用 socket 函数返回的 socket 描述符,my_addr 是一个指向包含
有本机 IP 地址及端口号等信息的 sockaddr 类型的指针;addrlen 常被设置为
sizeof(struct sockaddr)。
struct sockaddr 结构类型是用来保存 socket 信息的: