半关闭状态也就是:
当 TCP 链接中 A 向 B 发送 FIN 请求关闭,另一端 B 回应 ACK 之后(A 端进入 FIN_WAIT_2 状态),并没有立即发送 FIN 给 A,A 方处于半连接状态(半开关),此时 A 可以接收 B 发 送的数据,但是 A 已经不能再向 B 发送数据。
Copy #include <sys/socket.h>
int shutdown(int sock, int howto);
/*
成功时返回 0 ,失败时返回 -1
sock: 需要断开套接字文件描述符
howto: 传递断开方式信息
*/
Copy struct hostent
{
char *h_name; /* Official name of host. */
char **h_aliases; /* Alias list. */
int h_addrtype; /* Host address type. */
int h_length; /* Length of address. */
char **h_addr_list; /* List of addresses from name server. */
};
Copy #include <netdb.h>
//通过域名得到struct hostent
struct hostent *gethostbyname(const char *hostname);
/*
成功时返回 hostent 结构体地址,失败时返回 NULL 指针
*/
//通过ip得到struct hostent
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
/*
成功时返回 hostent 结构体变量地址值,失败时返回 NULL 指针
addr: 含有IP地址信息的 in_addr 结构体指针。为了同时传递 IPV4 地址之外的全部信息,该变量的类型声明为 char 指针
len: 向第一个参数传递的地址信息的字节数,IPV4时为 4 ,IPV6 时为16.
family: 传递地址族信息,ipv4 是 AF_INET ,IPV6是 AF_INET6
*/
Copy struct hostent *host;
//host = gethostbyname(argv[1]); 通过域名获取
//通过ip获取
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[1]);
host = gethostbyaddr((char *)&addr.sin_addr, 4, AF_INET);
if (!host) {
error_handling("gethost...error");
}
printf("official name : %s \n", host->h_name);
for (int i = 0; host->h_aliases[i]; ++i) {
printf("aliases %d : %s \n", i + 1, host->h_aliases[i]);
}
printf("address type : %s \n", host->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6");
for (int i = 0; host->h_addr_list[i]; ++i) {
printf("ip addr %d : %s\n", i + 1, inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
}
Copy #include <unistd.h>
int pipe(int filedes[2]);
/*
成功时返回 0 ,失败时返回 -1
filedes[0]: 通过管道接收数据时使用的文件描述符,即管道出口
filedes[1]: 通过管道传输数据时使用的文件描述符,即管道入口
*/
//使用方法
int fds[2];
int ret = pipe(fds);
if(ret == -1) {
error_handling("pipe() error");
}
//操作fds[0], fds[1]来进行读写即可,要注意顺序
....
Copy #include <stdio.h>
FILE *fdopen(int fildes, const char *mode);
/*
成功时返回转换的 FILE 结构体指针,失败时返回 NULL
fildes : 需要转换的文件描述符
mode : 将要创建的 FILE 结构体指针的模式信息,即r w a r+ ...
*/
#include <stdio.h>
int fileno(FILE *stream);
/*
成功时返回文件描述符,失败时返回 -1
*/
int dup(int oldfd); //复制文件描述符并返回,失败返回-1 int dup2(int oldfd, int newfd); //复制文件描述符并返回,失败返回-1