sizeof(struct sockaddr_in));dest_addr.sin_family = AF_INET;

时间:2021-07-30 07:46:29

根本常识部分:

1. 根基流程

sizeof(struct sockaddr_in));dest_addr.sin_family = AF_INET;

Process Client Server Comment
socket()   创建socket文件描述符   同←   通信双方都需成立
socket文件描述符是应用层通信接口
 
bind()   可选
一般不绑定,由内核自动分配
  必选
IP地点不能为公网地点
长途:一般设置为"0.0.0.0"或 INADDR_ANY
局域网:可设置为内网地点
  详细可见:
https://www.cnblogs.com/ok-lanyan/articles/2634242.html
 
Listen()   可选,一般不监听   必选
使socket处于监听网络状态
  梗阻期待  
connect()   向处事端倡议链接请求   ?   包罗方针主机的IP和Port  
accept()   ?   处事端接受链接请求
接受链接后,使用一个新的socket描述符,
使处事端可接受多个链接
  可以提取客户真个IP和Port  
Send/Recv()   进行数据包的发送和接受   同←   socket同样可以认为是文件,
可以直接read/write()
 
close()   *socket链接   同←   可以分隔*读/写操纵  
2. API 1). Socket() #include <sys/socket.h> int socket(int domain, int type, int protocol) /* Return Value: * If successed: A file descriptor for new socket * else : -1 */

①. domain:

用于选择本次通信的协议簇(地点簇);
其详细界说见 /usr/include/bits/socket.h, 常用的宏如下:

Name Purpose Man page
AF_UNIX,
AF_LOCAL
  Local communication   unix(7)  
AF_INET   IPv4 Internet protocols   ip(7)  
AF_INET6   IPv6 Internet protocols   ipv6(7)  
AF_IPX   IPX - Novell   protocols  
AF_NETLINK   Kernel user interface device   netlink(7)  

②. type

协议类型
详细信息见/usr/include/bits/socket_types.h,常用的如下:

Type Purpose
SOCK_STREAM   Provides sequenced, reliable, two-way, connection-based byte streams.
An out-of-band data transmission mechanism may be supported.
 
SOCK_DGRAM   Supports datagrams (connectionless,
unreliable messages of a fixed maximum length).
 

③. protocol

一般由系统自动选择,凡是设置为0

2). bind()

当使用socket()创建一个socket后,,存在着一个name space,但是没有内存地点与其关联;
本函数的目的就是为了分配内存地点给socket

#include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) /* Return Value: * If successsed: 0 * else: -1 */

①. socktfd

socket()函数返回的socket文件描述符

②. addr

分配给socket的地点空间首地点;
按照协议的差别,布局体界说差别,可以使用man 7 ip/ipv6/etc..检察;
一般的界说形式如下:

/* Structure describing a generic socket address. */ struct sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ }; /*IF flags = AF_INET, 即IPv4*/ struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ }; /* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ };

③. addrlen

地点长度,一般使用sizeof(xx)

3). Listen() #include <sys/socket.h> int listen(int sockfd, int backlog) /* * backlog: 请求排队的最大长度 */ /* Return Value * If successed: 0 * else: -1 */ 4). connect() #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); /* Return Value * If successed: 0 * else: -1 */ 5). accept() int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); /* Return Value * If successed: 有效的接收到的socket描述符 * else: -1 */ 6). read/write()