当前位置: 首页 > wzjs >正文

石河子网站建设公司seo关键词优化推广

石河子网站建设公司,seo关键词优化推广,深圳建设网站公司,北京微网站建设公司目录 1. TCP通信流程 2. 服务器端的通信流程 2.1 创建用于监听的套接字 2.2 绑定本地IP地址和端口 2.3 设置监听 2.4 等待接受客户端的连接请求 2.5 与客户端进行通信 2.6 客户端连接服务器 3.代码实现 client.cpp server.cpp 运行方式 在本文中,我们将…

目录

1. TCP通信流程

2. 服务器端的通信流程

2.1 创建用于监听的套接字

2.2 绑定本地IP地址和端口

2.3 设置监听

2.4 等待接受客户端的连接请求

2.5 与客户端进行通信

2.6 客户端连接服务器

3.代码实现

client.cpp

server.cpp

运行方式


在本文中,我们将深入了解套接字(socket)及其在网络通信中的应用,特别是如何在服务器端创建一个基于TCP的简单通信框架。套接字是程序员进行网络通信的一组接口,主要分为客户端和服务器端。在这篇文章中,我们将重点关注服务器端的实现。

1. TCP通信流程

TCP(传输控制协议)是一个面向连接、安全可靠的流式传输协议,它位于传输层,确保数据的准确传输。

2. 服务器端的通信流程

下面是整个服务器端的通信流程:

2.1 创建用于监听的套接字

首先,我们需要创建一个套接字来监听客户端的连接请求。代码示例如下:

// 创建一个套接字,函数原型
int socket(int domain, int type, int protocol);// 使用
int fd = socket(AF_INET, SOCK_STREAM, 0);

包含的头文件: #include <sys/socket.h>

参数说明:

  • domain:地址族协议(如 AF_INET 表示使用IPv4,AF_INET6 表示使用IPv6)
  • type:数据传输协议(SOCK_STREAM 表示TCP,SOCK_DGRAM 表示UDP)
  • protocol:一般设为0,表示使用默认协议

返回值: 成功返回可用于套接字通信的文件描述符,失败返回 -1。

2.2 绑定本地IP地址和端口

接下来,我们将文件描述符与本地IP地址和端口进行绑定。

// 函数原型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// 使用
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(10000);
addr.sin_addr.s_addr = htonl(INADDR_ANY);int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));

参数说明:

  • sockfd:监听的文件描述符
  • addr:要绑定的IP和端口信息
  • addrlenaddr指向的内存大小(sizeof(struct sockaddr)

返回值: 成功返回0,失败返回 -1。

2.3 设置监听

绑定后,接下来需要设置监听。

// 函数原型
int listen(int sockfd, int backlog);// 使用
int ret = listen(fd, 128);

参数说明:

  • sockfd:之前绑定的文件描述符
  • backlog:指定最大连接请求数

返回值: 成功返回0,失败返回 -1。

2.4 等待接受客户端的连接请求

现在我们需要等待并接受客户端的连接请求。

// 函数原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);// 使用
struct sockaddr caddr;
memset(&caddr, 0, sizeof(caddr));
socklen_t len = sizeof(caddr);
int cfd = accept(fd, (struct sockaddr*)&caddr, &len);

参数说明:

  • sockfd:之前创建的文件描述符
  • addr:传出参数,存储客户端的地址信息
  • addrlen:传出参数,存储地址大小

返回值: 成功返回一个文件描述符,用于与客户端通信,失败返回 -1。注意,这个函数是阻塞的,直到有新的连接请求到来。

2.5 与客户端进行通信

接下来,可以通过readwrite函数与客户端进行通信。

接收数据:

ssize_t read(int sockfd, void *buf, size_t size);
// 使用
char buf[1024] = {0};
int len = read(cfd, buf, sizeof(buf));

发送数据:

ssize_t write(int fd, const void *buf, size_t len);
// 使用
char msg[] = "Hello, Client!";
int size = write(cfd, msg, strlen(msg));

返回值说明:

  • 接收数据(read):成功时返回接收到的字节数,连接断开返回0,失败返回-1。
  • 发送数据(write):成功返回实际发送的字节数,失败返回-1。

2.6 客户端连接服务器

客户端时使用connect()函数连接服务器,代码示例如下:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// 使用
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(10000);
inet_pton(AF_INET, "1.1.1.1", &addr.sin_addr.s_addr); // 服务器IP地址int ret = connect(fd, (struct sockaddr*)&addr, sizeof(addr));

3.代码实现

 server.cpp

#include <stdlib.h>      // 提供exit函数
#include <stdio.h>       // 提供printf和perror函数
#include <unistd.h>      // 提供close函数
#include <arpa/inet.h>   // 提供socket、bind、listen、accept等函数
#include <string.h>      // 提供memset函数int main()
{// 1. 创建用于监听的套接字int fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1) {perror("socket"); // 输出错误信息exit(1);          // 退出程序}// 2. 绑定IP地址和端口struct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr)); // 清空结构体saddr.sin_family = AF_INET; // 使用IPv4saddr.sin_port = htons(10000); // 监听端口,使用网络字节序saddr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有可用的接口int ret = bind(fd, (struct sockaddr*)&saddr, sizeof(saddr));if (ret == -1) {perror("bind"); // 输出错误信息exit(1);        // 退出程序}// 3. 设置监听ret = listen(fd, 128); // 监听套接字,最大连接请求数为128if (ret == -1) {perror("listen"); // 输出错误信息exit(1);          // 退出程序}// 4. 等待并接受客户端的连接struct sockaddr_in cliaddr; // 保存客户端的地址信息socklen_t len = sizeof(cliaddr); // 地址结构体的大小int cfd = accept(fd, (struct sockaddr*)&cliaddr, &len); // 阻塞等待连接if (cfd == -1) {perror("accept"); // 输出错误信息exit(1);          // 退出程序}// 打印新连接的客户端信息char ip[64] = { 0 };printf("new client fd:%d ip:%s, port:%d\n", cfd,inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ip, sizeof(ip)), // 获取客户端IPntohs(cliaddr.sin_port)); // 获取客户端端口// 5. 与客户端进行通信char buf[512];while (1) {memset(buf, 0, sizeof(buf)); // 清空缓冲区int len = read(cfd, buf, sizeof(buf)); // 从客户端读取数据if (len > 0) { // 成功接收到数据printf("client says: %s\n", buf); // 打印客户端发送的消息write(cfd, buf, len); // 将相同的数据回发给客户端}else if (len == 0) { // 客户端关闭了连接printf("client is disconnect..\n");break; // 退出循环}else { // 读取失败perror("read"); // 输出错误信息break; // 退出循环}}close(fd); // 关闭监听套接字close(cfd); // 关闭客户端连接套接字return 0; // 程序结束
}

client.cpp

#include <stdlib.h>      // 提供exit函数
#include <stdio.h>       // 提供printf和perror函数
#include <unistd.h>      // 提供close函数
#include <arpa/inet.h>   // 提供socket、connect等函数
#include <string.h>      // 提供memset和strlen函数int main()
{// 1. 创建套接字用于连接服务器int fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1) {perror("socket");  // 输出错误信息exit(1);          // 退出程序}// 2. 定义服务器地址和端口struct sockaddr_in saddr; // 创建一个结构体用于存储服务器地址memset(&saddr, 0, sizeof(saddr)); // 清空该结构体saddr.sin_family = AF_INET; // 使用IPv4地址saddr.sin_port = htons(10000); // 设置监听端口,使用网络字节序inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr); // 设置服务器IP地址为localhost// 3. 连接服务器int ret = connect(fd, (struct sockaddr*)&saddr, sizeof(saddr));if (ret == -1) {perror("connect");  // 输出错误信息exit(1);            // 退出程序}// 4. 与服务器进行通信int n = 0; // 计数器while (1){// 发送数据char buf[512] = { 0 }; // 初始化缓冲区sprintf(buf, "hi, I am client...%d\n", n++); // 格式化字符串write(fd, buf, strlen(buf)); // 发送数据到服务器// 接收服务器反馈memset(buf, 0, sizeof(buf)); // 清空缓冲区int len = read(fd, buf, sizeof(buf)); // 从服务器读取数据if (len > 0) // 成功接收到数据{printf("server say: %s\n", buf); // 打印服务器返回的数据}else if (len == 0) // 服务器关闭了连接{printf("server disconnect...\n");break; // 退出循环}else // 读取失败{perror("read"); // 输出错误信息break; // 退出循环}sleep(1);   // 每隔1秒发送一条数据}close(fd); // 关闭套接字return 0; // 程序结束
}

运行方式

  1. 编译代码: 在终端中使用 g++ 编译器编译 client.cppserver.cpp。假设在同一目录下,输入以下命令:

    g++ server.cpp -o server
    g++ client.cpp -o client
    
  2. 运行服务器: 首先打开一个终端,运行服务器程序:

    ./server
    
  3. 运行客户端: 然后打开另一个终端,运行客户端程序:

    ./client
    
  4. 观察输出: 客户端将每隔一秒发送一条消息,服务器将在终端显示接收到的消息,并回发给客户端。您可以观察客户端和服务器的输出信息。

  5. 结束运行: 在客户端和服务器之间的通信完成后,可以在客户端终端按 Ctrl+C 结束客户端,服务器将自动检测到客户端的断开并输出相应消息。

http://www.dtcms.com/wzjs/452271.html

相关文章:

  • 猪八戒网仿照哪个网站做的今日新闻 最新消息 大事
  • wps上怎么做网站点击分析表seo网站推广工具
  • 便利的邯郸网站建设淘宝店铺怎么推广和引流
  • 为什么要做网站首页设计三明网站seo
  • 如何设计b2c电子商务网站免费国外ddos网站
  • 网站源码下载免费源码网络推广发帖网站
  • 本地部署iis部署网站营销软文是什么意思
  • 求网站制作百度代理加盟
  • 响应式网站自助建设推广营销企业
  • 酒店要做关于网站ppt怎么做北京发生大事了
  • 嵌入式软件开发和c++软件开发360优化大师官方最新
  • b2c行业网站系统采集站seo提高收录
  • 长春网站建设ccnbkj国内优秀网站案例
  • 小程序 微网站站长工具搜索
  • 创新的盐城网站开发开封网站设计
  • 鲨鱼座 网站建设2023年新冠疫情最新消息
  • 做网站下一页百度识图官网
  • 网站设计用什么软件做文章推广平台
  • 定制开发网站如何报价单最新消息新闻
  • 个人网站可以做百度搜索妈妈关键字有哪些
  • 论坛网站论坛网站建设建设进入百度首页官网
  • 大学生做微商网站网络营销的四大要素
  • 专做外贸的网站有哪些seo排名赚官网
  • 网站建设 自助建站网络销售这个工作到底怎么样
  • 宁波造价工程信息网整站seo免费咨询
  • 网站顶端大图怎么做好用的推广平台
  • 应用市场华为seo百度百科
  • shopify如何做瀑布流网站软件推广怎么赚钱
  • 织梦做的网站图片路径在哪长春网站制作设计
  • 做电商网站多少钱产品销售方案与营销策略