1. gethostbyaddr, gethostbyname
struct hostent* gethostbyaddr(const char* addr, int len, int type);
struct hostent* gethostbyname(const char* name);
struct hostent
{
char* h_name;
// 主机名
char** h_aliases;
// 可选主机队列
short h_addrtype;
// 主机类型
short h_length;
// 地址长度
char** h_addr_list;
// 主机地址列表
};
该组函数目的是根据一个IP地址或者主机名取得计算机名
2. gethostname, getpeername, getsockname
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
struct sockaddr_in
{
short sin_family;
// 地址类型
unsigned short sin_port;
// 端口
struct in_addr sin_addr;
// IP地址
char sin_zero[8];
// 缺位不齐
};
struct in_addr {
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr; // IP地址的长整表示法
} S_un;
} ;
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr; // IP地址的长整表示法
} S_un;
} ;
int gethostname(char* name, int namelen);
取本地计算机名
int getpeername(SOCKET s, struct sockaddr* name, int namelen);
取已连接对端的计算机地址结构
int getsockname(SOCKET s, struct sockaddr* name, int namelen);
取本地已连接的计算机地址结构
3. getprotobyname, getprotobynumber
struct protoent
{
char* p_name;
// 正式协议名, TCP, UDP...
char** p_aliases;
// 可选协议名队列
short p_proto;
// 协议系列号
};
struct protoent* getprotobyname(char* name);
根据协议名取得协议体
struct protoent* getprotobynumber(int number);
根据按主机顺序排列的协议号取协议体
4. getservbyname, getservbyport
struct servent
{
char* s_name;
// 正式服务名, HTTP, FTP
char** s_aliasnames;
// 可选服务名队列
short s_port;
// 端口号
char* s_proto;
// 协议名, TCP, UDP
}
struct servent* getservbyname(const char* name,
// 服务名, HTTP, FTP
const char* proto);
// 协议名, TCP, UDP
根据服务名&端口号取服务体
struct servent* getservbyport(int port,
// 端口号
const char* proto);
// 协议名
根据端口号&协议名取服务体
5. getsockopt, setsockopt
获取/设置套接字的选项
6. htonl, ntohl, htons, ntohs
主机/网络字节转换
7. inet_addr, inet_ntoa
unsigned long inet_addr(const char* szIpAddr);
// IPv4地址转换成in_addr
char* inet_ntoa(struct in_addr in);
// in_addr结构转换成IPv4的字符串
8. ioctlsocket
设置套接字IO模式
9. sendto, recvfrom, send, recv, connect, bind之关系
从 TCP 与 UDP 的过程理解"sendto" "send" "recv" "recvfrom" "bind" "connect"
(1) TCP
服务器端:
建立一个空套接字-->将空套接字 bind 本地IP和端口号-->通过 "listen" 把这个套接字置为“监听”状态-->
通过 accept (监听套接字)得到一个“连接套接字”-->对这个“连接套接字”进行 recv, send 操作-->原有的
监听套接字可继续使用
客户端:
建立一个空套接字-->把这个空套接字 connect 到目的地IP和端口号-->对这个套接字进行 recv, send 操作
(2) UDP
服务器端:
建立一个空套接字-->将空套接字 bind 本地IP和端口号--> recvfrom 这个套接字
客户端:
建立一个空套接字
-->将空套接字
connect 到目的IP和端口号-->对这个套接字进行
send 操作(为避免理解错误,这种用法要避免)
-->对空套接字进行
sendto 操作(只采用这种用法)
TCP 是一种面向连接的通信方式,建立连接后,才能进行send, recv操作;
UDP 是一种“非连接方式”,接收端bind本地IP和端口号,接收所有该端口的数据;而发送端只需要建立一个空套接字,利用sendto向目的IP和端口号发送即可。
bind 只能把“一个本地的IP”绑定到一个空socket上,而connect, accept本质上也是一种“绑定”。
其内部含义是什么呢?尤其是在UDP通信中,也能用connect+send的方式取代sendto,含义何在?