找工作小项目:day1-建立套接字

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));

5、补充

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值