网络编程之流式套接字

流式套接字(SOCK_STREAM)是一种网络编程接口,它提供了一种面向连接的、可靠的、无差错和无重复的数据传输服务。这种服务保证了数据按照发送的顺序被接收,使得数据传输具有高度的稳定性和正确性。通常用于那些对数据的顺序和完整性有严格要求的应用。通常由传输控制协议(TCP)来实现。TCP协议通过建立连接、数据分包的编号和确认、以及重传机制等方式来确保数据的可靠传输。尽管这种服务提供了高度的可靠性,但它也可能导致较高的网络资源占用率。

 客户端代码

//客户端
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")//告诉链接器将 ws2_32.lib 这个库文件链接到可执行文件中,以便使用 Windows Sockets API
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET sockClient;//客户端Socket
SOCKADDR_IN addrServer;//服务端地址
WSAStartup(MAKEWORD(2,2),&wsaData);
sockClient=socket(AF_INET,SOCK_STREAM,0);//创建一个TCP类型的流式Socket。AF_INET指定使用IPv4协议//定义要连接的服务端地址
addrServer.sin_family=AF_INET;
addrServer.sin_addr.s_addr=inet_addr("127.0.0.1");//127.0.0.1是本地环回地址,因为这里客户端和服务端在同一个主机上
addrServer.sin_port=htons(6000);//连接端口6000//连接到服务端
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//发送数据
char message[30]="Hello Socket!";//准备要发送的消息,字符串长度限制在 30 字节以内。
send(sockClient,message,strlen(message)+1,0);//要发送的消息的长度,包括字符串结尾的空字符,以确保接收方能正确地识别字符串的结束0。//关闭socket
closesocket(sockClient);
WSACleanup();
printf("success!\n");//简单的打印输出,表示程序正常运行
return 0;
}

服务端代码 

//服务端
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]) {WSADATA wsaData;SOCKET sockServer;SOCKADDR_IN addrServer;SOCKET sockClient;SOCKADDR_IN addrClient;WSAStartup(MAKEWORD(2, 2), &wsaData);sockServer = socket(AF_INET, SOCK_STREAM, 0);addrServer.sin_addr.s_addr = INADDR_ANY;addrServer.sin_family = AF_INET;addrServer.sin_port = htons(6000);//指定服务端的监听端口号为 6000。 bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));//bind函数将Socket与指定的地址和端口绑定listen(sockServer, 5); //开始监听连接请求,5 表示队列中最多可以容纳 5 个待处理的连接请求。printf("服务器已启动;\n监听中...\n");int len = sizeof(SOCKADDR);//用于存储客户端地址信息的结构体的大小char recvBuf[100];//用于接收客户端发送的消息的缓冲区。sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len);//accept函数接受客户端的连接请求recv(sockClient, recvBuf, 100, 0);//接收客户端发送的消息存储在 recvBuf 中。printf("%s\n", recvBuf);closesocket(sockClient);//关闭与客户端的连接套接字closesocket(sockServer);//关闭服务端监听套接字WSACleanup();printf("success!\n");//表示正常运行return 0;
}

 先运行服务器,开始监听

然后运行客户端

服务器结果如下,收到客户端发来的消息Hello Socket!

套接字函数

1、socket函数:创建一个套接字

socket(AF, type, protocol);

AF:指定套接字使用的地址族,常见的值包括 AF_INET(IPv4 地址族)和 AF_INET6(IPv6 地址族)

type:套接字类型,可选SOCK_STREAM(流式套接字),和 SOCK_DGRAM(数据报套接字)

protocol:指定套接字使用的协议,通常设置为默认0

例如本实验创建一个IPv4 地址族的流式套接字

socket(AF_INET,SOCK_STREAM,0)

2、bind函数:将一个套接字与一个IP地址绑定在一起。

bind(s, sockaddr *name, int namelen)

s:要绑定地址的套接字变量。

name:指向包含地址信息的 sockaddr 结构体的指针。

namelen:name 结构体的长度

客户端套接字在发出连接请求后,由内核自动绑定到一个临时端口和地址上,所以不需要这个函数。而作为服务器,一般是工作在被动连接的方式下,所以必须通过显示的调用bind()将监听套接字绑定到一个端口上,以等待客户端的连接。

例如本实验将套接字sockServer绑定地址为&addrServer上的信息

bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR))

3、listen函数:将指定的套接字设置为监听状态

listen(s, max)

s:要设置为监听状态的套接字变量

max:等待连接队列的最大长度

例如本实验将sockServer设置为监听模式,最多可以同时连接5个客户端

listen(sockServer, 5)

4、connect函数:用于将套接字连接到指定的目标地址

connect(s, sockaddr *name, namelen)

s:请求连接的套接字变量

name: sockaddr 结构体的指针,包含了要连接的目标地址和端口信息

namelen:name 结构体的长度

例如本实验请求连接的套接字是sockClient,要连接的目的地址是&addrServer

connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR))

5、accept 函数:用于接受客户端的连接请求,并创建一个新的套接字来与客户端进行通信。

accept(s, sockaddr *addr, int *addrlen)

s:处于监听状态的套接字

addr:存储客户端地址信息的指针

addrlen:指向一个整数变量的指针,用于存储客户端地址信息的结构体的长度。需要将addrlen设置为 sizeof(struct sockaddr)

例如本实验sockServer处于监听状态,客户端地址为addrClient

sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len)

6、send函数:向已连接的套接字发送数据

send(s, buf, len)

s:发送数据的套接字变量。

buf:指向要发送数据的缓冲区的指针。

len:要发送的数据的长度(以字节为单位)。

调用 send 函数后,它会将指定长度的数据从缓冲区 buf 发送到套接字 s 所连接的目标。

例如本实验sockClient发送数据长度为strlen(message)+1的数据

send(sockClient,message,strlen(message)+1,0)

7、recv函数:用于接收通过已连接套接字传输的数据

recv(s, buf, len)

s:要接收数据的套接字变量

buf:指向接收数据的缓冲区的指针

len:缓冲区长度,即接收数据的最大长度

例如本实验接收sockClient发到recvBuf缓冲区的信息

recv(sockClient, recvBuf, 100, 0)

8、closesocket函数:用于关闭套接字被关闭的套接字不能再用于任何操作

closesocket(s)

客户端:socket() --> connect() --> send() --> recv() --> close()

服务端:socket() --> bind() --> listen() --> accept() --> recv() --> close()

send函数可以用write函数代替,recv 函数可以用write函数代替,但是send函数和recv函数能在跨平台的网络编程中使用,所以建议使用send和recv以确保更好的可移植性和兼容性。

结构体

1、sockaddr结构体

struct sockaddr {

    unsigned short sa_family; // 地址族,地址的类型,如 AF_INETAF_INET6

    char sa_data[14]; // 地址数据

};

2、sockaddr_in结构体

struct sockaddr_in {

    short sin_family;           // 地址族,通常设置为 AF_INETIPv4

    unsigned short sin_port;    // 端口号,网络字节序

    struct in_addr sin_addr;    // IP地址

    char sin_zero[8];           // 保留字段,通常填充0

};

3、in_addr结构体

struct in_addr {

    unsigned long s_addr;  // 存储 IPv4 地址的 32 位整数,采用网络字节序

};

4、SOCKET结构体

用于声明套接字变量,然后再将这个变量传入套接字函数进行操作

5、WSADATA 结构体

初始化变量,然后将该变量传入WSAStartup()函数,该函数的作用是初始化 Windows Sockets API。告知系统将要使用的套接字库的版本号。如MAKEWORD(2, 2)表示使用版本号为 2.2 的套接字库,程序执行完后使用WSACleanup()函数释放Winsock库的资源

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

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

相关文章

【vue3学习笔记(一)】vue3简介;使用vue-cli创建工程;使用vite创建工程;分析工程结构;安装开发者工具

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 对应课程136-140节 课程 P136节 《vue3简介》笔记 课程 P137节 《使用vue-cli创建工程》笔记 官方文档&#xff1a; https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create官方文档地址 查看vue-cli版本&#x…

不要盲目开抖店,这才是开店的正确流程,2024全新版教程

我是王路飞。 抖音小店和视频号小店&#xff0c;我更建议没有经验的新手去做抖音小店。 虽然现在抖音小店不属于是一个蓝海项目了&#xff0c;但它依旧是我们普通人借助抖音流量变现非常重要的一个渠道&#xff0c;甚至没有之一。 至于视频号小店&#xff0c;可以说是当下最…

【JSON2WEB】11 基于 Amis 角色功能权限设置页面

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

油缸位置传感器871D-DW2NP524-N4

概述 油缸位置传感器是一种使用电感原理来检测物体接近的开关装置。它通过感应物体的电磁场来判断物体的位置&#xff0c;并将信号转化为电信号输出。当物体靠近或远离电感式接近开关时&#xff0c;物体的电磁场会改变&#xff0c;从而使接近开关产生不同的信号输出。电感式接…

Chrome 插件 tabs API 解析

Chrome.tabs API 解析 使用 chrome.tabs API 与浏览器的标签页系统进行交互&#xff0c;可以使用此 API 在浏览器中创建、修改和重新排列标签页 Tabs API 不仅提供操作和管理标签页的功能&#xff0c;还可以检测标签页的语言、截取屏幕截图&#xff0c;以及与标签页的内容脚本…

MySQL面试汇总(一)

MySQL 如何定位慢查询 如何优化慢查询 索引及其底层实现 索引是一个数据结构&#xff0c;可以帮助MySQL高效获取数据。 聚簇索引和非聚簇索引 覆盖索引 索引创建原则 联合索引

6. 学习方法和Java概述

文章目录 1&#xff09;学习方法2&#xff09;Java是什么&#xff1f; 1&#xff09;学习方法 作为一个0基础入门的同学&#xff0c;在刚开始学习的时候&#xff0c;我们不要追求知识点的深度&#xff0c;而是要追求知识点的广度。简单来说&#xff0c;学一个知识点不要想的太…

TCP和UDP分别是什么?TCP和UDP的区别

在计算机网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种重要的传输层协议&#xff0c;它们在数据传输过程中发挥着关键作用。本文将深入探讨TCP和UDP的定义、特点以及它们之间的区…

【Qt】QDialog对话框

目录 一、概念 二、对话框的分类 2.1 模态对话框 2.2 非模态对话框 2.3 混合属性对话框 三、消息对话框QMessageBox 四、颜色对话框QColorDialog 五、文件对话框QFileDialog 六、字体对话框QFontDialog 七、输入对话框QInputDialog 一、概念 对话框是GUI程序中不可或…

MrDoc寻思文档 个人wiki搭建

通过Docker快速搭建个人wiki&#xff0c;开源wiki系统用于知识沉淀&#xff0c;教学管理&#xff0c;技术学习 部署步骤 ## 拉取 MrDoc 代码 ### 开源版&#xff1a; git clone https://gitee.com/zmister/MrDoc.git### 专业版&#xff1a; git clone https://{用户名}:{密码…

「媒体宣传」如何针对不同行业制定媒体邀约方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 针对不同行业制定媒体邀约方案时&#xff0c;需要考虑行业特点、目标受众、媒体偏好以及市场趋势等因素。 一、懂行业 先弄清楚你的行业是啥样&#xff0c;有啥特别之处。 了解行业的热…

PPT没保存怎么恢复?3个方法(更新版)!

“我刚做完一个PPT&#xff0c;正准备保存的时候电脑没电自动关机了&#xff0c;打开电脑后才发现我的PPT没保存。这可怎么办&#xff1f;还有机会恢复吗&#xff1f;” 在日常办公和学习中&#xff0c;PowerPoint是制作演示文稿的重要工具。我们会在各种场景下使用它。但有时候…

鸿蒙OS开发实例:【工具类封装-页面路由】

import common from ohos.app.ability.common; import router from ohos.router 封装app内的页面之间跳转、app与app之间的跳转工具类 【使用要求】 DevEco Studio 3.1.1 Release api 9 【使用示例】 import MyRouterUtil from ../common/utils/MyRouterUtil MyRouterUtil…

【jmeter+ant+jenkins】之搭建 接口自动化测试平台

平台搭建 (1). 录制jmeter脚本 (2). 将jmeter的安装目录下的G:\jmeter\apache-jmeter-5.1.1\extras中&#xff0c;将 ”ant-jmeter-1.1.1.jar”文件放到 ant的lib目录下 (3). 配置jmeter的xml配置文件&#xff0c;并放在ant目录的bin目录下&#xff0c;使用ant编译验证jmeter的…

[linux初阶][vim-gcc-gdb] OneCharter: vim编辑器

一.vim编辑器基础 目录 一.vim编辑器基础 ①.vim的语法 ②vim的三种模式 ③三种模式的基本切换 ④各个模式下的一些操作 二.配置vim环境 ①手动配置(不推荐) ②自动配置(推荐) vim是vi的升级版,包含了更加丰富的功能. ①.vim的语法 vim [文件名] ②vim的三种模式 命令…

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点

QT 二维坐标系显示坐标点及点与点的连线-通过定时器自动添加随机数据点 功能介绍头文件C文件运行过程 功能介绍 上面的代码实现了一个简单的 Qt 应用程序&#xff0c;其功能包括&#xff1a; 创建一个 MainWindow 类&#xff0c;继承自 QMainWindow&#xff0c;作为应用程序的…

深度好文:解决Ubuntu 18.04安装nvidia显卡驱动,导致内核不匹配:无需重装系统修复内核

深度好文&#xff1a;解决Ubuntu 18.04安装nvidia显卡驱动&#xff0c;导致内核不匹配&#xff1a;无需重装系统修复内核 目录 一、问题描述二、尝试修复三、安装Nvidia驱动和CUDA并配置cuDNN四、总结 一、问题描述 昨天打算更新一下Ubuntu 18.04的显卡驱动&#xff0c;以支持…

基于SpringCloud+Hadoop+Vue实现的企业级网盘系统实现

编程语言&#xff1a;Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 开发环境&#xff1a;Windows 10 Mysql 开发工具&#xff1a;WebStorm、IDEA编译器、Git、Maven 应用部署服务器&#xff1a;SpringBoot内置Tomcat插件 Node服务器&#xff1a;Node v10.1…

jconsole jvisualvm

jconsole 打开方式 命令行输入 jconsole双击想要连接的应用 界面展示 jvisualvm 打开方式 命令行输入 jvisualvm双击想要连接的应用 可以安装插件&#xff0c;比如 Visual GC 直观看到 GC 过程

最新版puppeteer 在linux下的安装教程

最新版的 puppeteer 在安装的时候&#xff0c;Chromium不会自动下载&#xff0c;导致安装失败 这个时候需要跳过Chromium的安装&#xff0c;然后手动下载Chromium并安装。 1、先设置npm跳过Chromium下载 export PUPPETEER_SKIP_DOWNLOADtrue 2、安装puppeteer npm i pup…