目录
写入数据函数 write()
当服务器端在接收到一个客户端的连接后,可以通过套接字描述符进行数据的写入操作。对套接字进行写入的形式和过程与普通文件的操作方式一致,内核会根据文件描述符的值来查找所对应的属性,当为套接字的时候,会调用相对应的内核函数。
下面是一个向套接字文件描述符中写入数据的例子,将缓冲区 data 的数据全部写入套接字文件描述符 s 中,返回值为成功写入的数据长度。
int size;
char data[1024] = "write test";
size = write(s, data, 1024);
读取数据函数 read()
与写入数据类似,使用 read 函数可以从套接字描述符中读取数据。当然,在读取数据之前,必须建立套接字并连接。读取数据的方式如下所示,从套接字描述符 s 中读取1024个字节,放入缓冲区 data 中, size 变量的值为成功读取的数据大小。
int size;
char data[1024] = {0};
size read(s, data, 1024);
关闭套接字函数
关闭 socket 连接可以使用 close()函数实现,函数的作用是关闭已经打开的 socket 连接,内核会释放相关的资源,关闭套接字之后就不能再使用这个套接字文件描述符进行读写操作了。
函数 shutdown()可以使用更多方式来关闭连接,允许单方向切断通信或者切断双方的通信。函数原型如下,第一个参数 s 是切断通信的套接口文件描述符,第二个参数 how 表示切断的方式。
include <sys/socket.h>
int shutdown(int s, int how);
函数shutdown()用于关闭双向连接的一部分,具体的关闭行为方式通过参数的 how 设置来实现。可以为如下值。
SHUT_RD :值为0,表示切断读,之后不能使用此文件描述符进行读操作。
SHUT_WR :值为1,表示切断写,之后不能使用此文件描述符进行写操作。
SHUT_RDWR :值为2,表示切断读写,之后不能使用此文件描述符进行读写操作,与 close()函数功能相同。
函数shutdown()如果调用成功则返回0,如果失败则返回 -1,通过 errno 可以获得错误的具体信息,错误值含义参见下表: