CS架构---Socket基础

目录

  • 一、Socket简介
    • 1.1 通信模型
    • 1.2 类型
    • 1.3 创建和使用:
    • 1.4 地址族
  • 二、客户/服务器模式
    • 2.1 服务器端(Server Side)
    • 2.2 客户端(Client Side)
    • 2.3 通信方式
    • 2.4 角色分工
    • 2.5 优点
  • 三、Socket实战
  • 四、常见应用场景


一、Socket简介

Socket(套接字)是在网络编程中用于实现网络通信的一种机制。它是一个抽象的概念,可以看作是网络通信的端点,通过套接字可以进行数据的发送和接收。

1.1 通信模型

Socket提供了一种通信模型,使得不同主机之间可以进行数据交换和通信。它允许在不同主机之间建立连接,进行数据的传输和通信。

1.2 类型

在网络编程中,常用的Socket类型有两种:流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。
流式套接字提供了面向连接的、可靠的、双向的数据传输,使用TCP协议。
数据报套接字提供了无连接的、不可靠的数据传输,使用UDP协议。

1.3 创建和使用:

在使用Socket进行网络编程时,通常需要调用系统提供的Socket API函数,如socket()、bind()、listen()、accept()、connect()、send()、recv()等来创建套接字、绑定地址、监听连接、接受连接、连接远程主机、发送数据、接收数据等操作。

1.4 地址族

在Socket编程中,常用的地址族包括IPv4(AF_INET)、IPv6(AF_INET6)等,用于指定套接字的地址类型。
套接字描述符:

每个Socket都有一个唯一的套接字描述符(Socket Descriptor),用于标识和操作该套接字。套接字描述符是一个整数值,可以用来识别和管理套接字。


二、客户/服务器模式

在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server, C/S)模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。
客户/服务器模式的建立基于以下两点:

(1)首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。
(2)其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户/服务器模式的TCP/IP。

在这里插入图片描述

2.1 服务器端(Server Side)

在Socket编程中,服务器端负责监听客户端的连接请求,并处理客户端发送过来的数据。服务器端通常创建一个Socket并绑定到特定的端口,然后通过listen()函数开始监听客户端的连接请求。一旦有客户端连接进来,服务器端会调用accept()函数接受连接,并创建一个新的Socket与客户端进行通信。服务器端可以根据客户端发送的数据进行相应的处理,并向客户端发送数据作为响应。

2.2 客户端(Client Side)

在Socket编程中,客户端负责与服务器端建立连接,并向服务器端发送请求。客户端通常创建一个Socket并通过connect()函数连接到服务器端指定的IP地址和端口。一旦连接建立成功,客户端可以通过该Socket向服务器端发送数据请求,并等待服务器端的响应。客户端接收到服务器端的响应后,可以进行相应的处理和显示。

2.3 通信方式

在Socket编程中,客户端和服务器端之间通过Socket建立连接进行通信。客户端可以向服务器端发送数据请求,服务器端接收请求并进行处理,然后向客户端发送响应。这种请求-响应的通信方式是Socket编程中CS架构的基本通信模式。

2.4 角色分工

在Socket编程中,客户端和服务器端各自承担不同的角色和任务。服务器端负责监听连接请求、处理数据和发送响应;客户端负责建立连接、发送请求和接收响应。通过这种角色分工,实现了Socket编程中CS架构的通信和协作。

2.5 优点

在Socket编程中使用CS架构,可以方便地实现客户端和服务器端之间的通信和数据交换。CS架构具有良好的可扩展性和灵活性,适用于各种网络应用场景。

三、Socket实战

实现一个客户端发送端互发消息的小demo
客户端

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUFSIZE 1024char buffer_send[BUFSIZE] = {0};
char buffer_recv[BUFSIZE] = {0};// send to server
void * sendMsg(void *socket){int * client_socket = (int *)socket;while(1){// send data to serverscanf("%s", buffer_send);printf("client send message: %s",buffer_send);send(*client_socket, buffer_send, strlen(buffer_send), 0);// is exitif(!strncasecmp(buffer_send, "quit", 4)){break;}}pthread_exit(NULL);
}// recv from server
void * recvMsg(void *socket){int * client_socket = (int *)socket;while(1){// clear buffer_recvbzero(buffer_recv, BUFSIZE);// read data from clientif(recv(*client_socket, buffer_recv, BUFSIZE, 0) > 0){printf("Message from server:%s\n", buffer_recv);}// is exitif(!strncasecmp(buffer_send, "quit", 4)){break;}}pthread_exit(NULL);
}int main(){// create socketint client_socket = socket(AF_INET, SOCK_STREAM, 0);// requset serverstruct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));// fill zeroserver_addr.sin_family = AF_INET;// use IPV4 addressserver_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// ipserver_addr.sin_port = htons(6666);// portconnect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));// clear buffer_recvbzero(buffer_recv, BUFSIZE);			// recv data from serverif(recv(client_socket, buffer_recv, BUFSIZE, 0) > 0){printf("Message from server:%s\n", buffer_recv);}// create send and recv threadpthread_t send_thread, recv_thread;pthread_create(&send_thread, NULL, sendMsg, (void *)&client_socket);pthread_create(&recv_thread, NULL, recvMsg, (void *)&client_socket);// wait send and recv thread overpthread_join(send_thread, NULL);pthread_join(recv_thread, NULL);// closeclose(client_socket);return 0;
}

编译一下:
g++ client.c -o client -pthread

服务端

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>#define BUFSIZE 1024char buffer_send[BUFSIZE] = "connect stablish!";
char buffer_recv[BUFSIZE] = {0};// send to client
void * sendMsg(void *socket){int * client_socket = (int *)socket;while(1){// send data to clientscanf("%s", buffer_send);printf("sever send message: %s\n",buffer_send);send(*client_socket, buffer_send, strlen(buffer_send), 0);// is exitif(!strncasecmp(buffer_send, "quit", 4)){break;}}pthread_exit(NULL);
}// recv from client
void * recvMsg(void *socket){int * client_socket = (int *)socket;while(1){// clear buffer_recvbzero(buffer_recv, BUFSIZE);// read data from clientif(recv(*client_socket, buffer_recv, BUFSIZE, 0) > 0){printf("Message from client:%s\n", buffer_recv);}// is exitif(!strncasecmp(buffer_send, "quit", 4)){break;}}pthread_exit(NULL);
}int main(){// create socketint server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// bind ip port to socketstruct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));// use zero fillserver_addr.sin_family = AF_INET;// use IPV4 addressserver_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// ipserver_addr.sin_port = htons(6666); // portbind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));// listenlisten(server_socket, 20);// accept client requeststruct sockaddr_in client_addr;socklen_t client_addr_size = sizeof(client_addr);int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);// send stablish info to clientsend(client_socket, buffer_send, strlen(buffer_send), 0);// create send and recv threadpthread_t send_thread, recv_thread;pthread_create(&send_thread, NULL, sendMsg,(void *)&client_socket);pthread_create(&recv_thread, NULL, recvMsg,(void *)&client_socket);// wait send and recv thread overpthread_join(send_thread, NULL);pthread_join(recv_thread, NULL);// closeclose(client_socket);close(server_socket);return 0;
}

编译一下:
g++ sever.c -o sever -pthread

实现的效果:

在这里插入图片描述

四、常见应用场景

  • 网络通信:用于实现客户端和服务器之间的通信,例如Web服务器和浏览器之间的通信。
  • 实时通信:用于实现实时通信应用,如即时通讯软件、在线游戏等。
  • 远程控制:用于实现远程控制应用,如远程桌面、远程监控等。
  • 文件传输:用于实现文件传输功能,如FTP(文件传输协议)。
  • 数据采集:用于实现数据采集和传输,如传感器数据采集系统。
  • 分布式计算:用于实现分布式系统中不同节点之间的通信和协作。
  • 云计算:用于实现云计算平台中不同服务之间的通信和数据交换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7个影响AEC的AI工具

人工智能&#xff08;AI&#xff09;工具在各个行业中越来越受欢迎&#xff0c;ChatGDP的推出无疑让人们看到了人工智能所能提供的可能性。 然而&#xff0c;人工智能不仅仅是生成文本或图形——它可以用于各种设置。 建筑行业也不例外&#xff0c;我们才刚刚开始发现人工智能…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…

kettle使用MD5加密增量获取接口数据

kettle使用MD5加密增量获取接口数据 场景介绍&#xff1a; 使用JavaScript组件进行MD5加密得到Http header&#xff0c;调用API接口增量获取接口数据&#xff0c;使用json input组件解析数据入库 案例适用范围&#xff1a; MD5加密可参考、增量过程可参考、调用API接口获取…

五、postman基础使用案例

postman基础使用 相关案例【传递查询参数】【提交表单数据】【提交JSON数据】 注&#xff1a;postman⼀款⽀持调试和测试的⼯具&#xff0c;开发、测试⼯程师都可以使⽤。方法一般统一为&#xff1a;方法→请求头→请求体→断言 相关案例 【传递查询参数】 访问TPshop搜索商品的…

【项目实战经验】DataKit迁移MySQL到openGauss(上)

前言 本文将分享DataKit迁移MySQL到openGauss的项目实战&#xff0c;供广大openGauss爱好者参考。 1. 下载操作系统 https://www.openeuler.org/zh/download https://support.huawei.com/enterprise/zh/doc/EDOC1100332931/1a643956 https://support.huawei.com/enterprise…

力扣热门算法题 174. 地下城游戏,189. 轮转数组,198. 打家劫舍

174. 地下城游戏&#xff0c;189. 轮转数组&#xff0c;198. 打家劫舍&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.31 可通过leetcode所有测试用例。 目录 174. 地下城游戏 解题思路 完整代码 Python Java 189. 轮转数…

The Sandbox 与 Otherworld 合作推出元宇宙网络漫画中心

​ The Sandbox 将与韩国初创公司 Otherworld 合作&#xff0c;建立一个元宇宙网络动漫中心&#xff0c;为用户提供基于 KakaoPage 热门 IP 的各种体验。 Solo Leveling 是此次合作的第一个 IP。这部网络动画将深入主人公Sung Jinwoo的生活&#xff0c;并与 NFT 进行整合。随后…

JavaScript(五)---【DOM】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针&#xff0c;函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…

[蓝桥杯练习]通电

kruskal做法(加边) #include <bits/stdc.h> using namespace std; int x[10005],y[10005],z[10005];//存储i点的x与y坐标 int bcj[10005];//并查集 struct Edge{//边 int v1,v2; double w; }edge[2000005]; int cmp(Edge a, Edge b){return a.w < b.w;} int find(i…

.pth文件转化为onnx文件,并进行可视化

1、文件转化 import torch.onnx from torchvision import models from onnxsim import simplify import onnx torch_model torch.load("D:\checkpoint-epoch40.pth",map_locationcpu) # pytorch模型加载 model models.resnet50() # model.load_state_dict(torch_…

代码随想录算法训练营第二十八天(回溯4)|93. 复原 IP 地址、78. 子集、90. 子集 II(JAVA)

文章目录 93. 复原 IP 地址解题思路源码 78. 子集解题思路源码 90. 子集 II解题思路源码 93. 复原 IP 地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&…

什么是Redis数据一致性?如何解决?

在系统中缓存最常用的策略是&#xff1a;服务端需要同时维护DB和cache&#xff0c;并且是以DB的结果为准–Cache-Aside Pattern&#xff08;缓存分离模式、旁路缓存&#xff09; 读数据 单纯的读数据是不会产生数据不一致&#xff0c;只有并发下读和写才会存在数据不一致。 写…

python2.7+rf框架搭建

一 下载pycharm 可下载最新版&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows 新建项目时需要关联python2.7&#xff0c;这个必须要python2.7安装好之后关联才生效&#xff0c;若也关联了&#xff0c;但创建项目后有弹框显示类似“项目创建失败”的提…

算法练习第四十二天|01背包问题、416. 分割等和子集

一些背包问题 01背包问题 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&#xff0c;它们各自…

nvme协议学习总结

一、nvme命令 1 nvme在pcie基础上的协议&#xff0c;与PCIE配合&#xff0c;实现高效传输。 2 nvme命令主要分IO命令和admin命令。 3 一个NVME CMD执行流程&#xff1a; step1&#xff1a;host把cmd写入SQ queue中&#xff1b; step2&#xff1a;host远端更新Device&#x…

BIT-5-动态内存管理(C语言进阶)

本章重点 为什么存在动态内存分配动态内存函数的介绍 mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟…

华为OD面试手撕算法-字符串压缩

题目描述 本题是leetcode原题&#xff1a;字符串压缩 字符串压缩。利用字符重复出现的次数&#xff0c;编写一种方法&#xff0c;实现基本的字符串压缩功能。比如&#xff0c;字符串"aabcccccaaa"会变为"a2b1c5a3"。若“压缩”后的字符串没有变短&#xf…

瑞吉外卖实战学习--12、分类管理的修改和删除接口实现

分类管理的修改和删除的接口实现 前言获取接口的方法修改接口的连接请求方式和参数删除接口的连接请求方式和参数 实现接口 前言 本篇实现分类的管理的修改和删除接口&#xff0c;在平时项目中最常用的就是增删改查接口&#xff0c;通过页面来的到请求的接口和方法然后通过创建…

在Java中对SQL进行常规操作的通用方法

SQL通用方法 一、常规方法增删改查二、具体优化步骤1.准备工作2.getcon()方法&#xff0c;获取数据库连接对象3.closeAll()方法&#xff0c;关闭所有资源4.通用的增删改方法5.通用的查询方法6.动态查询语句 总结 一、常规方法增删改查 在常规方法中&#xff0c;我们在Java中对…

数据挖掘|贝叶斯分类器及其Python实现

分类分析|贝叶斯分类器及其Python实现 0. 分类分析概述1. Logistics回归模型2. 贝叶斯分类器2.1 贝叶斯定理2.2 朴素贝叶斯分类器2.2.1 高斯朴素贝叶斯分类器2.2.2 多项式朴素贝叶斯分类器 2.3 朴素贝叶斯分类的主要优点2.4 朴素贝叶斯分类的主要缺点 3. 贝叶斯分类器在生产中的…