何谓“面向连接”与“无连接”?

来源:互联网 发布: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;
} ;
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,含义何在?
原创粉丝点击