linux socket系统调用层
一. socket操作系统调用
我们在上一节中说到过,在应用层和协议无关层之间,是一个系统调用接口层。系统调用接口如下:
- socketcall socket系统调用
- socket 建立socket
- bind 绑定socket到端口
- connect 连接远程主机
- accept 响应socket连接请求
- send 通过socket发送信息
- sendto 发送UDP信息
- sendmsg 参见send
- recv 通过socket接收信息
- recvfrom 接收UDP信息
- recvmsg 参见recv
- listen 监听socket端口
- select 对多路同步I/O进行轮询
- shutdown 关闭socket上的连
- getsockname 取得本地socket名字
- getpeername 获取通信对方的socket名字
- getsockopt 取端口设置
- setsockopt 设置端口参数
- sendfile 在文件或端口间传输数据
- socketpair 创建一对已联接的无名socket
当在应用中调用socket()函数时,就会触发系统调用,跟socket相关的操作函数都会被映射到sys_socketcall
的系统调用中(32位系统),在文件unistd_32.h
中有其系统调用号表。对于64位系统,系统调用号会不一样,在文件unistd_64.h
中,跟socket相关的系统调用会直接对应,不用都映射到sys_socketcall
(实际上,64位系统中会通过定义__NO_STUBS
宏屏蔽这个调用号)。具体的系统调用过程可以参考如下链接:http://lib.csdn.net/article/embeddeddevelopment/55382
因为网络栈是在内核态,所以从socket api到操作socket插口存在一个系统调用层。在本文中,我们看到了当使用socket api时,是怎么调用到系统调用的,在下一篇中,将介绍对应的系统的调用是怎么操作socket插口的。