socket 编程

Linux C语言 server 端(TCP):

// socketServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>    // 提供 close、read 和 write (这里通过 send 间接使用,因为 send 是 write 的一个更高级别的封装)
#include <arpa/inet.h>   // 提供了用于网络地址转换的函数声明,如将点分十进制格式的 IP 地址转换为网络字节序,以及将端口号从主机字节序转换为网络字节序。#define PORT 12000    // socket 绑定的端口好
#define BUFFER_SIZE 1024       // 缓存大小int main() {int server_fd, new_socket;struct sockaddr_in address;     // 结构体,用于存储 IPv4 地址和端口号的信息。int opt = 1;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};const char *hello = "Hello from server";// 创建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {/*AF_INET:指定地址族为 IPv4。SOCK_STREAM:指定套接字类型为 TCP(面向连接的字节流)。0:指定协议为 0,通常对于 SOCK_STREAM 和 AF_INET,这个参数为 0,意味着使用 TCP。*/perror("socket failed");exit(EXIT_FAILURE);}// 绑定socket到端口if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET; // IPv4address.sin_addr.s_addr = INADDR_ANY; // 任何地址address.sin_port = htons(PORT); // 端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}// 接受连接while (1) {printf("等待连接...\n");if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}// 接收数据read(new_socket, buffer, BUFFER_SIZE);printf("收到消息: %s\n", buffer);// 发送数据send(new_socket, hello, strlen(hello), 0);printf("欢迎消息已发送\n");// 关闭当前连接close(new_socket);}// 关闭服务器socketclose(server_fd);return 0;
}

编译:gcc 编译器
gcc -o Csocket socketServer.c
运行:
./Csocket
在这里插入图片描述


Windows 10 C/C++ client 端使用 TCP 协议:

#include <iostream>
#include <stdlib.h>   // 包含 system() 函数
#include <winsock2.h>
#include <ws2tcpip.h> // 包含inet_pton的头文件#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库#define PORT 12000
#define BUFFER_SIZE 1024int main() {system("chcp 65001");    //在Windows 10及更高版本中, 使用 chcp 65001 设置命令行的字符集为 utf-8WSADATA wsaData;SOCKET sock;struct sockaddr_in server;char buffer[BUFFER_SIZE] = { 0 };const char* message = u8"你好,from client!";    // utf-8 字符串// 初始化Winsockif (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << u8"Failed to initialize Winsock. Error Code: " << WSAGetLastError() << std::endl;return 1;}// 创建Socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {std::cerr << u8"Could not create socket. Error Code: " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 配置服务器地址结构server.sin_family = AF_INET;server.sin_port = htons(PORT);if (inet_pton(AF_INET, "服务器 IPv4 地址", &server.sin_addr) <= 0) {std::cerr << u8"Invalid address/ Address not supported. Error Code: " << WSAGetLastError() << std::endl;closesocket(sock);WSACleanup();return 1;}// 连接到服务器if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {std::cerr << u8"Connect failed. Error Code: " << WSAGetLastError() << std::endl;closesocket(sock);WSACleanup();return 1;}// 发送数据send(sock, message, strlen(message), 0);std::cout << u8"消息已发送: " << message << std::endl;// 接收服务器的响应int bytes_received = recv(sock, buffer, BUFFER_SIZE - 1, 0); // 保留一个字节给 '\0'if (bytes_received > 0) {buffer[bytes_received] = '\0'; // 确保字符串结束std::cout << u8"收到来自服务器的消息: " << buffer << std::endl;}else {std::cerr << u8"接收数据失败. Error Code: " << WSAGetLastError() << std::endl;}// 关闭Socketclosesocket(sock);WSACleanup();return 0;
}

编译运行:Visual Studio 2022 编译环境:

服务器端:
在这里插入图片描述


Linux C++ socket 编程:

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 12000     // 端口
#define BUFFER_SIZE 1024class Server {
public:Server() {server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd < 0) {std::cerr << "Socket creation failed" << std::endl;exit(EXIT_FAILURE);}sockaddr_in address;int addrlen = sizeof(address);address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {std::cerr << "Bind failed" << std::endl;close(server_fd);exit(EXIT_FAILURE);}if (listen(server_fd, 3) < 0) {std::cerr << "Listen failed" << std::endl;close(server_fd);exit(EXIT_FAILURE);}std::cout << "Server is listening on port " << PORT << std::endl;}~Server() {close(server_fd);}void acceptConnection() {sockaddr_in address;int addrlen = sizeof(address);int new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);if (new_socket < 0) {std::cerr << "Accept failed" << std::endl;return;}char buffer[BUFFER_SIZE];int valread = read(new_socket, buffer, BUFFER_SIZE);std::cout << "Message from client: " << buffer << std::endl;const char *response = "Hello from server";send(new_socket, response, strlen(response), 0);std::cout << "Response sent to client" << std::endl;close(new_socket);}private:int server_fd;
};int main() {Server server;while (true) {server.acceptConnection();}return 0;
}

编译:g++ 编译器
g++ -o socket socketServer.cpp
运行:
./socket


Windows Client 端:

#include <iostream>  
#include <winsock2.h>  
#include <ws2tcpip.h>  
#include <string>  #pragma comment(lib, "Ws2_32.lib")  #define PORT 12000  
#define BUFFER_SIZE 1024  int main() {// 初始化Winsock  WSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);if (iResult != 0) {std::cerr << "WSAStartup failed: " << iResult << std::endl;return 1;}// 创建套接字  SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (clientSocket == INVALID_SOCKET) {std::cerr << "Error at socket(): " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 设置服务器地址和端口  sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(PORT);// 将服务器地址从文本转换为二进制形式  in_addr serverIP;if (inet_pton(AF_INET, "服务器端 IPv4 地址", &serverIP) <= 0) {std::cerr << "Invalid address/ Address not supported" << std::endl;closesocket(clientSocket);WSACleanup();return 1;}memcpy(&(serverAddr.sin_addr), &serverIP, sizeof(serverIP)); // 连接到服务器  iResult = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));if (iResult == SOCKET_ERROR) {std::cerr << "Error at connect(): " << WSAGetLastError() << std::endl;closesocket(clientSocket);WSACleanup();return 1;}std::cout << "Connected to server" << std::endl;// 发送消息到服务器  const char* sendbuf = "Hello from Windows client";send(clientSocket, sendbuf, strlen(sendbuf), 0);std::cout << "Message sent to server" << std::endl;// 接收来自服务器的响应  char recvbuf[BUFFER_SIZE] = { 0 };int iRecvResult = recv(clientSocket, recvbuf, BUFFER_SIZE, 0);if (iRecvResult > 0)std::cout << "Message from server: " << recvbuf << std::endl;else {std::cerr << "recv failed: " << WSAGetLastError() << std::endl;}// 关闭套接字  closesocket(clientSocket);// 清理Winsock  WSACleanup();return 0;
}

socket 简易 HTTP/1.1 请求

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>
#include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")#define PORT 8080     // Http 8080 端口
#define BUFFER_SIZE 50000    // 缓存大小int main() {system("chcp 65001");  // 设置命令行 utf-8 字符集,适用于 win10 及以上的系统// 初始化Winsock  WSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);if (iResult != 0) {std::cerr << "WSAStartup failed: " << iResult << std::endl;return 1;}// 创建套接字  SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (clientSocket == INVALID_SOCKET) {std::cerr << "Error at socket(): " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 设置服务器地址和端口  sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(PORT);// 将服务器地址从文本转换为二进制形式  in_addr serverIP;if (inet_pton(AF_INET, "此字符串修改填充为服务器 IPv4 地址", &serverIP) <= 0) {std::cerr << "Invalid address/ Address not supported" << std::endl;closesocket(clientSocket);WSACleanup();return 1;}memcpy(&(serverAddr.sin_addr), &serverIP, sizeof(serverIP));// 连接到服务器  iResult = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));if (iResult == SOCKET_ERROR) {std::cerr << "Error at connect(): " << WSAGetLastError() << std::endl;closesocket(clientSocket);WSACleanup();return 1;}std::cout << "Connected to server" << std::endl;// 发送消息到服务器  const char* sendbuf = u8"GET /path HTTP/1.1\r\nHost: [修改为服务器主机名]\r\nAccept: */*\r\nConnection: close\r\n\r\n";    // http 请求报文。 path 修改为请求资源的路径send(clientSocket, sendbuf, strlen(sendbuf), 0);std::cout << "Message sent to server: \n" << sendbuf << std::endl;// 接收来自服务器的响应  char recvbuf[BUFFER_SIZE] = { 0 };std::string fullResponse; // 用于存储完整的响应while (true) {      // 分块传输,接受完整的数据(拼接每次接受的 chunk)int iRecvResult = recv(clientSocket, recvbuf, BUFFER_SIZE - 1, 0);if (iRecvResult > 0) {recvbuf[iRecvResult] = '\0'; // 确保字符串结束fullResponse += recvbuf; // 将接收到的数据添加到完整响应中}else if (iRecvResult == 0) {// 连接关闭break;}else {std::cerr << "recv failed: " << WSAGetLastError() << std::endl;break;}}std::cout << "Message from server: " << fullResponse << std::endl;// 关闭套接字  closesocket(clientSocket);// 清理Winsock  WSACleanup();return 0;
}

以上代码可以拿来做测试,只能向支持 HTTP/1.1 的服务器发起请求,且不支持 HTTPS(需要SSL/TLS 握手)。

编译运行:环境 Visual Studio 2022。

请求一个 tomcat 服务器的默认 html 页面:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

国内常见DNS

国内常见DNS 1.阿里DNS 223.5.5.5 223.6.6.62.百度DNS 180.76.76.763.114DNS 114.114.114.114 114.114.115.1154.字节DNS 180.184.1.1 180.184.2.25.GoogleDNS 8.8.8.8个人综合排名是 阿里&#xff08;223.5.5.5&#xff09;>腾讯&#xff08;1.12.12.12&#xff09; ≈…

3D医学影像开发入门<四>:VS2019 + Qt5.15.2 + MITK-v2021.10编译及环境配置

1、MITK介绍 1.1 MITK概述 MITK 是一个开源框架&#xff0c;最初是作为德国癌症研究中心医学和生物信息学部 &#xff08;MBI&#xff09; 博士生的通用框架开发的。MITK 旨在支持开发具有高度交互性的领先医学成像软件。 MITK 几乎重复使用了 VTK 和 ITK 中的任何内容。因此&…

项目模块1~12总结:服务器大模块梳理

一、思维导图 二、设计思路 1、各种回调函数梳理 服务器里面包含了监听套接字和监听到的通信套接字&#xff08;新连接&#xff09;&#xff0c;我们要对这两种套接字进行设置回调函数&#xff0c;其中监听套接字里面只要设置读回调&#xff0c;通信套接字要设置5种回调&…

023集——CAD 窗体交互、多段线进行翻转、错误提示(CAD—C#二次开发入门)

效果如下&#xff1a; 窗体模块&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…

照明灯具哪个品牌好?2024照明灯十大知名品牌大公开

在现代生活中&#xff0c;护眼台灯已经成为许多加班族的必备神器。但是&#xff0c;市场上的护眼台灯种类繁多&#xff0c;价格也各有不同&#xff0c;我们也不能每一个都买回家进行测试&#xff0c;看看照明灯具哪个品牌好&#xff1f;别担心&#xff0c;我帮你们找了&#xf…

FileLink跨网数据摆渡系统:打破网络隔阂,轻松实现跨网络数据传输

在数字化时代&#xff0c;跨网络、跨区域的数据传输成为了企业和个人信息流通的重大挑战。而如今&#xff0c;FileLink跨网数据摆渡系统的问世&#xff0c;彻底解决了这一难题&#xff0c;帮助用户实现快速、安全、无缝的跨网络数据传输。 1. 跨网络数据传输的痛点 随着企业信…

C语言 — 指针的进阶

文章目录 前言一、字符指针二、指针数组三、数组指针数组名 与 &数组名 四、指针传参二维数组传参 五、函数指针结语 前言 通过前面的关于指针的学习&#xff0c;我们了解了指针的一些个特性。本篇文章我们将深入指针&#xff0c;挖掘指针更深处的知识。 在开始之前&#…

【机器学习导引】ch4-决策树

基本流程 两个需要解决的问题 属性顺序&#xff1a; 问题&#xff1a;哪些属性在前面&#xff0c;哪些属性在后面&#xff1f;这个问题指的是在处理数据或进行排序时&#xff0c;需要确定属性的排列顺序&#xff0c;以便更好地进行数据处理或分析。 属性选择&#xff1a; 问题…

[ DOS 命令基础 4 ] DOS 命令命令详解-端口进程相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

博客系统(SpringBoot项目)

文章目录 一、项目开发的流程二、项目开发2.1 准备工作2.2 开发公共模块&#xff1a;把能写的先写了什么是公共模块model层mapper层定义统一返回结果统一异常处理 2.2 博客列表页2.3 更改显示的时间2.4 博客详情页2.5 登录Session式登录方法分析使用Token来实现登录 2.6 强制登…

软件设计师笔记-数据结构

数据结构 数据元素的集合及元素间的相互关系和构造方法。 线性表的存储结构 顺序存储链式存储 单链表节点 typedef struct node { int data; struct node *link; }NODE, *LinkList; 双向链表 每个节点有两个指针&#xff0c;分别指出直接前驱和直接后继。 循环链表 尾…

LangChain Ollama实战文献检索助手(一)环境配置和输入输出解析

挑选合适的模型 调用API需要花钱&#xff0c;因此在搭建阶段最佳的方法是利用Ollama部署本地CPU推理的轻量化大模型。大模型选择可以参照hugging face的榜单open-llm-leaderboard。 这里对我来说&#xff0c;要选择的模型需要满足 1.ollama上有的模型。 2.推理速度快&#xff…

在docker中搭建redis哨兵环境

文章目录 一、引言二、环境准备前提条件目录结构 三、配置文件1. 主节点配置文件 sentinel-master.conf2. 从节点配置文件3. 哨兵配置文件 sentinel.conf4. Docker Compose 文件 四、启动 Docker Compose五、验证哨兵机制1. 检查主节点状态2. 检查从节点状态3. 检查哨兵状态4. …

上线不出网机器

不出网机器介绍 上线不出网机器是我们常见的问题&#xff0c;如何在内网中实现不出网机器的上线呢&#xff0c;我们分为了如下的形式&#xff0c;根据之前所学的内容我们开始进行实验&#xff0c;常见的网络拓扑如下 情况分类 上线不出网机器一般是指B区域的电脑上线到CS工具或…

Modbus解析流程全面升级:体验全新核心与终极优化!

01 前言 本文章原文发表于我的微信公众号&#xff0c;请大家关注阅读&#xff0c;涉及的源代码等都在公众号&#xff0c;请搜索公众号&#xff1a; 智能家居NodeRed和HomeAssistant 即可关注。 02 全面改进的解析流程 前面发布过的Modbus解析流程在经过多个设备测试后发现存…

Python邮差:如何用代码精确投递商品快递费用的密信

目录 一、准备工作 二、编写API请求脚本 三、解析与处理快递费用数据 四、案例应用&#xff1a;模拟电商平台的快递费用计算 五、自动化邮件通知 六、总结 在电子商务的广阔天地里&#xff0c;精确计算并快速传递商品快递费用是一项至关重要的任务。作为Python邮差&#…

修改sql server 数据库的排序规则Chinese_PRC_CI_AS(字符集+排序)

文章目录 引言I 解决方案案例II 知识扩展排序规则SQL SERVER支持的所有排序规则引言 新增sql server 数据库实例的默认排序规则不支持中文存储,导致乱码 解决方案: 修改排序规则为Chinese_PRC_CI_AS 或者 Chinese_PRC_Stroke_CI_AS_WS或者Chinese_PRC_CI_AI_KS_WS 仅对新增…

七十页PPT展示智驾时代来临,国产汽车零部件厂商准备几何?

u 智能汽车车身架构主要可分为感知、决策控制、执行及通信四大板块&#xff0c;目前国产汽车零部件供应商在感知系统已取得较强的话语权&#xff0c;在决策控制系统、执行系统领域亦取得一定竞争力。 u 感知系统主要硬件包括激光雷达、毫米波雷达、摄像头等&#xff1b;其中&a…

Springboot 整合 Java DL4J 打造自然语言处理之智能写作助手

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

moffee

https://github.com/BMPixel/moffee Moffee&#xff1a;一键将Markdown转换为专业PPT&#xff0c;支持多主题与实时预览 文章目录 1-安装1.1-环境1.2-编码 2-使用2.1-语法 moffee 演示让 Markdown 准备好演示为什么选择 moffee&#xff1f;展示用 Markdown 设置样式媒体布局 1-…