1.connect_to_client:
socket()函数用法详解:创建套接字
socket()函数用法详解:创建套接字 (biancheng.net)
不管是 Windows 还是 Linux,都使用 socket() 函数来创建套接字。socket() 在两个平台下的参数是相同的,不同的是返回值。
Linux 中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket 也是一个文件,也有文件描述符。使用 socket() 函数创建套接字以后,返回值就是一个 int 类型的文件描述符。
Windows 会区分 socket 和普通文件,它把 socket 当做一个网络连接来对待,调用 socket() 以后,返回值是 SOCKET 类型,用来表示一个套接字。
int socket(int af, int type, int protocol);
1) af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。AF 是“Address Family”的简写,INET是“Inetnet”的简写。AF_INET 表示 IPv4 地址,例如 127.0.0.1;AF_INET6 表示 IPv6 地址,例如 1030::C9B4:FF12:48AA:1A2B。
记住127.0.0.1
,它是一个特殊IP地址,表示本机地址
你也可以使用 PF 前缀,PF 是“Protocol Family”的简写,它和 AF 是一样的。例如,PF_INET 等价于 AF_INET,PF_INET6 等价于 AF_INET6。
2) type 为数据传输方式/套接字类型,常用的有 SOCK_STREAM(流格式套接字/面向连接的套接字) 和 SOCK_DGRAM(数据报套接字/无连接的套接字),我们已经在《套接字有哪些类型》一节中进行了介绍。
3) protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。
setsockopt 函数 (winsock.h)
setsockopt 函数 (winsock.h) - Win32 apps | Microsoft Learn
该函数设置套接字选项 。
1)语法:
int setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
2)参数:
[in] s
标识套接字的描述符。
[in] level
选项定义的级别 (例如,SOL_SOCKET) 。
[in] optname
要为其设置值的套接字选项 (,例如,SO_BROADCAST) 。 optname 参数必须是在指定级别内定义的套接字选项,或者行为未定义。
[in] optval
指向在其中指定所请求选项值的缓冲区的指针。
[in] optlen
optval 参数指向的缓冲区的大小(以字节为单位)。
3)返回值
如果未发生错误, 则 setsockopt 返回零。 否则,将返回SOCKET_ERROR值,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。
错误代码 | 含义 |
---|---|
在使用此函数之前,必须执行成功的 WSAStartup 调用。 | |
网络子系统失败。 | |
optval 参数指向的缓冲区不在进程地址空间的有效部分,或者 optlen 参数太小。 | |
正在执行阻止的 Windows 套接字 1.1 调用,或者服务提供商仍在处理回调函数。 | |
级别参数无效,或者 optval 参数指向的缓冲区中的信息无效。 | |
设置SO_KEEPALIVE时,连接已超时。 | |
指定提供程序或套接字 (选项未知或不受支持,请参阅) SO_GROUP_PRIORITY限制。 | |
设置SO_KEEPALIVE时,连接已重置。 | |
:描述符不是套接字。 |
perror()、errno 的使用
(45条消息) 【Socket网络编程】14. perror()、errno 的使用_Mister Zhu的博客-CSDN博客
perror ( )
用 来 将 上 一 个函 数 发 生 错 误 的 原 因
输 出 到 标 准 设备 (stderr
) 。参数 s
所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno
的值来决定要输出的字符串。
sockaddr结构体
socket编程——sockaddr_in结构体操作 - 周人假的 - 博客园 (cnblogs.com)
sockaddr_in 结构体:struct sockaddr_in中的in 表示internet,就是网络地址,这只是我们比较常用的地址结构,属于AF_INET地址族,他非常的常用
sockaddr_in结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
struct in_addr {
unsigned long s_addr;
}
unsigned char sin_zero[8];
}
sin_port和sin_addr都必须是NBO。一般可视化的数字都是HBO(本机字节顺序)
sin_zero 初始值应该使用函数 bzero() 来全部置零。一般采用下面语句:
struct sockaddr_in cliaddr;
bzero(&cliaddr,sizeof(cliaddr));
网络字节顺序NBO(Network Byte Order)和主机字节顺序(HBO,Host Byte Order)转换:
(45条消息) 网络字节顺序NBO(Network Byte Order)和主机字节顺序(HBO,Host Byte Order)转换_lxj434368832的博客-CSDN博客
htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"
sockaddr 和 sockaddr_in的相互关系:
一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数
- sockaddr_in用于socket定义和赋值
- sockaddr用于函数参数
socket通信 bind() 函数详解
(45条消息) socket通信 bind() 函数详解_socket.bind_行孤、的博客-CSDN博客
socket编程:listen()函数详解
(45条消息) socket编程:listen()函数详解_socket listen_超级大洋葱806的博客-CSDN博客
socket编程 accept函数详解
(45条消息) linux socket编程 accept函数详解_linux accept_handsome boy!的博客-CSDN博客
socket编程 close函数详解
(45条消息) linux socket编程 close函数详解_linux closesocket函数_handsome boy!的博客-CSDN博客
getnameinfo使用
(45条消息) getnameinfo使用_mayue_csdn的博客-CSDN博客
这个函数与getaddrinfo互补,它以一个套接口地址为参数,返回一个描述主机的字符串和一个描述服务的字符串。
inet_ntop函数 (ws2tcpip.h)
inet_ntop函数 (ws2tcpip.h) - Win32 apps | Microsoft Learn
InetNtop 函数将 IPv4 或 IPv6 Internet 网络地址转换为采用 Internet 标准格式的字符串