您的位置:首页 > 理论基础 > 计算机网络

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内核处理的呢?这个过程就是用户空间到内核空间的提交。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息