Linux网络协议源代码分析 之 入门
2012-02-29 09:29
399 查看
普通意义上的socket编程是基于GNU提供的库函数之上实现的,比创建一个socket时候调用的socket()函数就是在 sys/socket.h中定义的,此文件在Linux系统下的路径为: /usr/include/sys。 GNU提供的标准接口,可以用来创建socket,然后开始利用此socket通信。具体的接口如下所示:
1. 创建套接字接口socket函数。函数原型为:
int socket(int domain, int type, int protocol)
这个函数有三个参数,第一个参数指定协议族,如AF_INET(IPv4协议),AF_INET6 (IPv6协议),AF_LOCAL(Unix域协议)。第二个参数为套接字类型。第三个参数指定协议,也可以取0。Socket函数成功时返回一个套接字文件描述符。
2. 绑定套接字接口 bind函数。函数原型为:
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
其中各项参数的含义为:
sockfd:由socket调用返回的文件描述符
addrlen:就是sizeof(sockaddr), 套接字地址结构的长度
my_addr:一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;sockaddr的定义如下:
struct sockaddr{
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};
另外还有一种用于Internet的套接字地址结构类型:
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */
};
bind函数返回值表明操作成功或失败:成功返回0,出错返回-1。
3. 建立连接接口connect函数
面向连接的客户端程序使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:
int connect(int sockfd, struct sockaddr *serv_addr,int addrlen)
其中sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。connect函数在出现错误时返回-1,并且设置errno为相应的错误码。编写客户端程序无须调用bind()。
4. 监听接口 listen函数
listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。
int listen(int sockfd, int backlog)
5. 接受请求接口accept函数
accept函数由TCP服务器端调用,用来接受从客户端来的请求。如果没有请求,则该函数自行阻塞,直到有请求为止。
int accept(int sockfd, struct sockaddr *cliaddr,socklen_t *addrlen)
6. 关闭套接字接口close函数
int close( int sockfd)
close对TCP套接字sockfd的默认的操作是将其标识为已关闭并立即返回;这时套接字描述符就不能再被进程使用了,也不能作为read和write的参数了。
Linux 下socket网络编程是非常简单的一件事情,复杂的是其背后如何实现的,以及如何提交给Linux内核来完成相应的工作的。比如socket()函数返回的是一个整形变量,它是一个套接字的描述符,系统是如何将一个整形变量管理为套接字的描述符呢?再比send()函数是如何将用户申请的一块内存中的内容发给内核,而内核又经过了哪些处理转发出去的呢?这就需要深入Linux网络编程。
顺藤摸瓜,先看GNU对socket的处理。那么GNU又是如何将一个socket提交给Linux内核处理的呢?这个过程就是用户空间到内核空间的提交。
1. 创建套接字接口socket函数。函数原型为:
int socket(int domain, int type, int protocol)
这个函数有三个参数,第一个参数指定协议族,如AF_INET(IPv4协议),AF_INET6 (IPv6协议),AF_LOCAL(Unix域协议)。第二个参数为套接字类型。第三个参数指定协议,也可以取0。Socket函数成功时返回一个套接字文件描述符。
2. 绑定套接字接口 bind函数。函数原型为:
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
其中各项参数的含义为:
sockfd:由socket调用返回的文件描述符
addrlen:就是sizeof(sockaddr), 套接字地址结构的长度
my_addr:一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;sockaddr的定义如下:
struct sockaddr{
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};
另外还有一种用于Internet的套接字地址结构类型:
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */
};
bind函数返回值表明操作成功或失败:成功返回0,出错返回-1。
3. 建立连接接口connect函数
面向连接的客户端程序使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:
int connect(int sockfd, struct sockaddr *serv_addr,int addrlen)
其中sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。connect函数在出现错误时返回-1,并且设置errno为相应的错误码。编写客户端程序无须调用bind()。
4. 监听接口 listen函数
listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。
int listen(int sockfd, int backlog)
5. 接受请求接口accept函数
accept函数由TCP服务器端调用,用来接受从客户端来的请求。如果没有请求,则该函数自行阻塞,直到有请求为止。
int accept(int sockfd, struct sockaddr *cliaddr,socklen_t *addrlen)
6. 关闭套接字接口close函数
int close( int sockfd)
close对TCP套接字sockfd的默认的操作是将其标识为已关闭并立即返回;这时套接字描述符就不能再被进程使用了,也不能作为read和write的参数了。
Linux 下socket网络编程是非常简单的一件事情,复杂的是其背后如何实现的,以及如何提交给Linux内核来完成相应的工作的。比如socket()函数返回的是一个整形变量,它是一个套接字的描述符,系统是如何将一个整形变量管理为套接字的描述符呢?再比send()函数是如何将用户申请的一块内存中的内容发给内核,而内核又经过了哪些处理转发出去的呢?这就需要深入Linux网络编程。
顺藤摸瓜,先看GNU对socket的处理。那么GNU又是如何将一个socket提交给Linux内核处理的呢?这个过程就是用户空间到内核空间的提交。
相关文章推荐
- Linux下的网络协议分析工具-tcpdump快速入门手册
- Linux下的网络协议分析工具-tcpdump快速入门手册
- Linux下的网络协议分析工具-tcpdump快速入门手册
- Linux下的网络协议分析工具-tcpdump快速入门手册
- Linux下的网络协议分析工具-tcpdump快速入门手册
- Linux下的网络协议分析工具-tcpdump快速入门手册
- Linux网络协议源代码分析 之 主要数据结构体
- Linux网络协议源代码分析 之 系统调用
- Linux网络协议源代码分析 之 系统调用
- 【Linux网络编程】 网络协议入门
- Proxy源代码分析--谈谈如何学习linux网络编程
- Linux下的网络协议分析工具-tcpdump
- linux 网络协议分析---3
- Linux 下网络协议分析器 Wireshark 使用基础
- Linux下的网络协议分析工具-tcpdump
- Linux网络编程——网络协议入门
- 2-22 网络协议分析及Linux网络编程模型
- Linux下的网络协议分析工具-tcpdump
- Linux网络协议分析工具TCPDump
- linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一