分类: C/C++
2013-09-22 11:22:19
原文地址:socket编程——系统调用 作者:丫叩酱
socket programming---system call
一、网络连接相关的系统调用
socket() 创建套接字
bind() 绑定本机端口
connect() 建立连接
listen() 监听端口
accept() 接受连接
recv(), read(), recvfrom() 数据接收
send(), write(), sendto() 数据发送
close(), shutdown() 关闭套接字
二、网络信息检索相关的函数
gethostname() 获得主机名
getpeername() 获得与套接口相连的远程协议地址
getsockname() 获得套接口本地协议地址
gethostbyname() 根据主机名取得主机信息
gethostbyaddr() 根据主机地址取得主机信息
getprotobyname()根据协议名取得主机协议信息
getprotobynumber()根据协议号取得主机协议信息
getservbyname() 根据服务名取得相关服务信息
getservbyport() 根据端口号取得相关服务信息
三、Socket options相关的系统调用
ioctl()/fcntl() 设置套接口的工作方式
getsockopt()/setsockopt() 获取/设置一个套接口选项
四、调度相关的系统调用
select()
poll()
epoll()
注意:
一、网络连接相关的系统调用
1. bind():
#1. 服务器端调用bind()显示绑定一个地址和端口,这样客户端可以通过IP地址和端口号来连接服务器。
#2. 客户端自动绑定,通常没必要调用bind()显示绑定
#3. 对于服务器,一般来说,设为INADDR_ANY,由系统挑选一个地址:发往客户端的接口的那个地址,而发往客户端使用哪个接口则是由客户连接来时所决定的
2. connect():
#1. TCP连接(面向连接的socket)可成功调用connect()一次,若连接成功后被断开,则需关掉当前的socket,重新创建的socket,再去进行连接。
>TCP的socket在调用connect()时,会发起三次握手,意味着connect()调用可能阻塞
#2. UDP可调用connect(),但不是发起与远端主机的连接,只是通知本地的传输层
>以后默认发送数据报的地址是connect指定的地址
>以后只从connect指定的地址接收数据报,从其它地址来的数据报不接收
>>UDP socket可调用connect多次,去改变默认的关联地址
>>若不想跟任何地址关联,将地址结构中的sa_family参数设为AF_UNSPEC,然后调用connect()
3.shutdown():
#1. TCP连接是双向的(可读可写的),当使用close()时,会把读写通道都关闭,有时只希望关闭一个方向,此时可使用shutdown
三、Socket options相关的系统调用
1. fcntl():对文件描述符进行控制。(非阻塞方式工作)
2. ioctl():对设备进行控制。(控制指令和参数)
3. setsockopt()/getsockopt():对socket进行设置。(工作方式、调整参数、实现某些功能)
选项举例:
-SO_RCVBUF/SO_SNDBUF 接收/发送缓冲区大小
-SO_RCVLOWAT/SO_SNDLOWAT 接收/发送低潮值
-SO_REUSEADDR/SO_REUSEPORT 重用地址/端口
-SO_BROADCAST 广播
-IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP 加入/离开多播组
#1. 这些选项会影响多个层次的协议:
Socket的层:SOL_SOCKET(通用选项)、IPPROTO_IP(IP层选项)、IPPROTO_ICMPV6(ICMPV6层选项)、IPPROTO_IPV6(IPV6层选项)、IPPROTO_TCP(TCP层选项)
#2. 参数有3种情况:
>开关:0表示关闭,1表示打开
-SO_BROADCAST
-SO_REUSEADDR/SO_REUSEPORT
>值: 将option设置为该值大小
-SO_RCVBUF/SO_SNDBUF
-SO_RCVLOWAT/SO_SNDLOWAT
>结构体:不同的option可能定义不同的结构体,其成员的意义分别说明
-SO_LINGER
-SO_RCVTIMEO/SO_SNDTIMEO
四、调度相关的系统调用
select()/poll()/epoll()
1. 相同点:
作用是一样的,通知该函数我们希望的事情,该函数会告诉我们结果
2. 不同点:
#1. 参数不同