何谓“面向连接”与“无连接”?
来源:互联网 发布:python 解压zip 编辑:程序博客网 时间:2024/05/22 00:32
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,含义何在?
- 何谓“面向连接”与“无连接”?
- 面向连接与无连接的区别!
- 面向连接 无连接
- 面向连接和无连接
- 面向连接和无连接
- 无连接服务器与面向连接的服务器
- 面向连接和无连接的服务
- 面向连接和无连接协议
- 面向有连接和无连接
- 面向连接和无连接协议
- 面向连接服务、无连接服务
- 面向连接和无连接的区别
- 面向连接和无连接的正确理解:
- 面向连接/无连接套接字
- 面向无连接的通信实例
- UDP(面向无连接)的socket编程
- Berkeley Socket工作过程(面向连接&无连接)
- 面向连接的通信和无连接的通信
- 简单的活页(转)
- Sql中的getDate()函数的日期格式
- 定位new
- 只能在执行 Render() 的过程中调用 RegisterForEventValidation;
- AppLocale使用后安装程序乱码问题的解决
- 何谓“面向连接”与“无连接”?
- 文件夹选项里显示所有文件不见了的问题解决
- InstallShield 12.0 简介
- Java正则表达式入门
- Oracle SOA 3、Oracle BPEL流程管理器
- 揭开谜底:Google如何赚钱的?
- 又遇到访问内存越界错误
- C++ 编码规范 (2)
- 大樟溪风光