根本常识部分:
1. 根基流程 Process Client Server Commentsocket() 创建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, 常用的宏如下:
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,常用的如下:
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
①. socktfd
socket()函数返回的socket文件描述符
②. addr
分配给socket的地点空间首地点;
按照协议的差别,布局体界说差别,可以使用man 7 ip/ipv6/etc..检察;
一般的界说形式如下:
③. 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()