day1-建立套接字
在回环地址上建立服务器用8888端口接收数据包。
1、服务器/客户端最简单的设计-套接字(socket)
在Linux系统中万物皆是文件,而文件需要有标识符,套接字就是用来描述这个文件的标识符(个人理解)。
127.0.0.1是系统中的回环地址,发送到这个IP的数据包不会离开主机走向网络(复习计算机网络)。
服务器在创建套接字过程中需要IP地址类型、数据传输方式、协议。
2、服务器/客户端设计流程
服务器:
socket->bind->listen->read/write->close
客户端:
socket->connect->read/write->close
请牢记上述设计流程,会在后续设计中按这个思路进行,类分装后如果没有明确会很难理清楚逻辑。
3、服务器
创建套接字,AF_INET为IPv4,SOCK_STREAM为TCP传输方式,0为自动推导协议。
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
服务端/客户端的地址是需要绑定到socket上的,上面提到过Linux上万物都是文件,文件需要对我们创建的目标有一些描述。这些描述是需要单独定义出来的。
struct sockaddr_in serv_addr;
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(8888);
绑定描述到socket上。
bind(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));
监听该文件,即监听该服务器。
listen(sockfd, SOMAXCONN);
为客户端地址进行初始化,但是现在不知道客户端的信息,注意客户端的地址不像服务端地址由管理者自己选择,客户端地址是由系统指定。
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_len = sizeof(clnt_addr);
bzero(&clnt_addr, sizeof(clnt_addr));
服务端接收客户端的连接请求,accept发生在三次握手之后。
复习三次握手:
服务端syn->客户端syn/ack->服务端ack->accept建立连接
int clnt_sockfd = accept(sockfd, (sockaddr*)&clnt_addr, &clnt_addr_len);
4、客户端
创建服务器套接字,注意是服务器,由于服务器地址固定,因此客户端需要知道自己和谁链接,以便分配客户端地址。
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(8888);
客户端与服务端进行连接
connect(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));