TCP通信的实现过程
socket函数 与 通信域
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
-domain: 指定通信域(通信地址族);
-type: 指定套接字类型;
-protocol: 指定协议;
套接字类型与协议
-type: 指定套接字类型
TCP唯一对应流式套接字,所以选择SOCK_STREAM(数据报套接字:SOCK_DGRAM)
-protocol: 指定协议
流式套接字唯一对应TCP,所以无需要指定协议,设为0即可
bind函数 与 通信结构体
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-sockfd:socket函数生成的套接字
-addr:通信结构体
-addrlen:通信结构体的长度
bind函数 与 通信结构体
IPv4地址族结构体
struct sockaddr_in {
sa_family_t sin_family; /* 地址族: AF_INET */
in_port_t sin_port; /* 网络字节序的端口号 */
struct in_addr sin_addr; /*IP地址结构体 */
};
/* IP地址结构体 */
struct in_addr {
uint32_t s_addr; /* 网络字节序的IP地址 */
};
通用地址族结构体
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
示例:为套接字fd绑定通信结构体addr
addr.sin_family = AF_INET;
addr.sin_port = htons(5001);
addr.sin_addr.s_addr = 0;
bind(fd, (struct sockaddr *)&addr, sizeof(addr) );
listen函数 与 accept函数
/*监听套接字*/
int listen(int sockfd, int backlog);
/*处理客户端发起的连接,生成新的套接字*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
-sockfd: 函数socket生成的套接字
-addr:客户端的地址族信息
-addrlen:地址族结构体的长度