服务器:
- 创建socket文件描述符 使用socket函数 (协议类型 IPv4 或者IPv6)
1 | int socket(int domain,int type,int protocol); |
- 为socket绑定IP地址和端口号
1 | int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen); |
- 监听客户端发来的端口请求
1 | int listen(int sockfd,int backlog) |
- 接受来自客户端的请求 (服务器被动打开连接,没有客户端连接时服务器会被阻塞)
1 | int accept(int sockfd, struct sockaddr * addr,socklen_t *addrlen); |
\5. 从socket中读取数据或者写入数据
网络I/O操作有下面机组:
read() / write()
recv() / send()
readv() / writev()
recvmsg() / sendmsg()
recvfrom() / sendto()
常用的是:read() 和write()
读:
1 | ssize_t read(int fd,void *buf,size_t count); |
写:
1 | ssize_t write(int fd,const void *buf,size_t nbytes); |
- 关闭socket (客户端先关闭连接)
1 |
|
close() 把描述符的引用计数减一,仅在计数为0时才关闭套接字。
shutdown()函数可以指定关闭读或者写,howto的参数值有如下三个:
SHUT_RD : 关闭套接字的读,即套接字中不再有数据可接收,而且套接字接收缓冲区中的现有数据都丢弃。
SHUT_WR : 关闭套接字的写,对于TCP套接字这是办关闭。当前留在套接字中发送缓冲区的数据被发送掉,后跟TCP的正常连接终止序列。进程不能对这样的套接字调用任何描述符。
SHUT_RDWR: 读写都关闭。相当于两次调动shutdown(),第一次调用指定SHUTRD,第二次调用指定SHUT_WR
客户端
创建socket 同服务器创建socket一样
连接指定的服务器和端口
1 | int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen); |
向socket中写入数据或者读取数据 同服务器读写一样
关闭socket 同服务器关闭一样
tcp 服务器端例子 (windows下):
1 |
|
客户端:
1 |
|