Socket实现TCP

devtools/2024/10/18 9:23:41/

参考1

客户端

//客户端
#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {//定义长度变量int send_len = 0;int recv_len = 0;//定义发送缓冲区和接受缓冲区char send_buf[100];char recv_buf[100];//定义服务端套接字,接受请求套接字SOCKET s_server;//服务端地址客户端地址SOCKADDR_IN server_addr;initialization();//填充服务端信息server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");server_addr.sin_port = htons(1234);//创建套接字s_server = socket(AF_INET, SOCK_STREAM, 0);if (connect(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "服务器连接失败!" << endl;WSACleanup();}else {cout << "服务器连接成功!" << endl;}//发送,接收数据while (1) {cout << "请输入发送信息:";cin >> send_buf;send_len = send(s_server, send_buf, 100, 0);if (send_len < 0) {cout << "发送失败!" << endl;break;}recv_len = recv(s_server, recv_buf, 100, 0);if (recv_len < 0) {cout << "接受失败!" << endl;break;}else {cout << "服务端信息:" << recv_buf << endl;}}//关闭套接字closesocket(s_server);//释放DLL资源WSACleanup();return 0;
}
void initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);if (err != 0) {cout << "初始化套接字库失败!" << endl;}else {cout << "初始化套接字库成功!" << endl;}//检测版本号if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2){cout << "套接字库版本号不符!" << endl;WSACleanup();}else {cout << "套接字库版本正确!" << endl;}//填充服务端地址信息}

服务端

//服务器
#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {//定义长度变量int send_len = 0;int recv_len = 0;int len = 0;//定义发送缓冲区和接受缓冲区char send_buf[100];char recv_buf[100];//定义服务端套接字,接受请求套接字SOCKET s_server;SOCKET s_accept;//服务端地址客户端地址SOCKADDR_IN server_addr;SOCKADDR_IN accept_addr;initialization();//填充服务端信息server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(1234);//创建套接字s_server = socket(AF_INET, SOCK_STREAM, 0);if (bind(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "套接字绑定失败!" << endl;WSACleanup();}else {cout << "套接字绑定成功!" << endl;}//设置套接字为监听状态if (listen(s_server, SOMAXCONN) < 0) {cout << "设置监听状态失败!" << endl;WSACleanup();}else {cout << "设置监听状态成功!" << endl;}cout << "服务端正在监听连接,请稍候...." << endl;//接受连接请求len = sizeof(SOCKADDR);s_accept = accept(s_server, (SOCKADDR*)& accept_addr, &len);if (s_accept == SOCKET_ERROR) {cout << "连接失败!" << endl;WSACleanup();return 0;}cout << "连接建立,准备接受数据" << endl;//接收数据while (1) {recv_len = recv(s_accept, recv_buf, 100, 0);if (recv_len < 0) {cout << "接受失败!" << endl;break;}else {cout << "客户端信息:" << recv_buf << endl;}cout << "请输入回复信息:";cin >> send_buf;send_len = send(s_accept, send_buf, 100, 0);if (send_len < 0) {cout << "发送失败!" << endl;break;}}//关闭套接字closesocket(s_server);closesocket(s_accept);//释放DLL资源WSACleanup();return 0;
}
void initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);if (err != 0) {cout << "初始化套接字库失败!" << endl;}else {cout << "初始化套接字库成功!" << endl;}//检测版本号if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {cout << "套接字库版本号不符!" << endl;WSACleanup();}else {cout << "套接字库版本正确!" << endl;}//填充服务端地址信息}

参考2

Client:


#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")  
#define PORT 8080int main() 
{// 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){return 0;}// 创建 socketSOCKET socket = ::socket(AF_INET, SOCK_STREAM, 0);if (socket == INVALID_SOCKET){return 0;}// 设置服务器信息SOCKADDR_IN serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8080); // 服务器的端口号//serverAddress.sin_addr.s_addr = inet_addr(ipBuffer); // 服务器的 IP 地址inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr.s_addr);// 连接到服务器if (connect(socket, (SOCKADDR*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR){closesocket(socket);WSACleanup();return 0;}std::string data = "机器切割状态为:";if (send(socket, data.c_str(), data.size(), 0) == SOCKET_ERROR){closesocket(socket);WSACleanup();return 0;}Sleep(100);// 关闭 socketclosesocket(socket);// 清理 WinsockWSACleanup();return 0;
}

Server:

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")  
#define PORT 8080int main()
{// 初始化Winsock  WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {std::cerr << "WSAStartup failed.\n";return 1;}//创建socket文件描述符SOCKET server_fd = ::socket(AF_INET, SOCK_STREAM, 0);if (server_fd == INVALID_SOCKET){perror("socket failed");exit(EXIT_FAILURE);}//定义sockaddr_in 结构体变量 ,并清零sockaddr_in  address;memset(&address, 0, sizeof(address));int addrlen = sizeof(address);address.sin_family = AF_INET;address.sin_port = htons(PORT);address.sin_addr.s_addr = INADDR_ANY;//绑定socket与端口if (bind(server_fd, (LPSOCKADDR)&address, sizeof(address)) == SOCKET_ERROR){perror("bind failed");exit(EXIT_FAILURE);}//监听端口if (listen(server_fd, 3) < 0){perror("Fiald to listen socket");exit(EXIT_FAILURE);}std::cout << "server is listening" << std::endl;int  new_socket;// 等待客户端连接  struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);if ((new_socket = accept(server_fd, (SOCKADDR*)&client_addr, &client_addr_len)) == -1){std::cerr << "Fiald to accept socket" << std::endl;exit(EXIT_FAILURE);}std::cout << "a client connected" << std::endl;char buffer[1024] = { 0 };// 读取数据  recv(new_socket, buffer, 1024, 0);std::cout << "Message from client: " << buffer << std::endl;const char* hello = "hello from server";// 发送响应  send(new_socket, hello, strlen(hello), 0);std::cout << "Hello message sent\n";// 关闭socket  closesocket(new_socket);closesocket(server_fd);// 清理Winsock  WSACleanup();return 0;
}

http://www.ppmy.cn/devtools/98759.html

相关文章

虚幻5|AI视力系统,听力系统,预测系统(3)预测系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;2&#xff09;听力系统-CSDN博客 一&#xff0c;添加一个AI预感感官配置 1.选中我们的AIPerception,右侧细节添加一个AI预感感官配置&#xff0c;然后我们把所有感官的年龄都调成5&#xff0c;是所有 2…

对话框 Ref或者dom都拿不到详解

https://www.cnblogs.com/trampeagle/p/15146668.html element-UI 组件 dialog 中 ref 获取不到的问题解决方案_el-dialog ref获取不到-CSDN博客

《通义千问AI落地—中》:前端实现

一、前言 本文源自微博客且已获授权,请尊重版权. 书接上文&#xff0c;上文中&#xff0c;我们介绍了通义千问AI落地的后端接口。那么&#xff0c;接下来我们将继续介绍前端如何调用接口以及最后的效果&#xff1b;首先看效果&#xff1a; 上述就是落地到本微博客以后的页面效果…

Pandas.str

Pandas 的 .str 是字符串操作方法&#xff0c;它是 Pandas 中 Series 对象的一部分&#xff0c;提供了对序列中的每个字符串元素进行操作的能力。以下是一些常用的 .str 方法&#xff1a; str.len()&#xff1a;返回字符串的长度。str.lower()&#xff1a;将所有大写字母转换为…

如何使用Cesium加载WeServer发布的地图服务

前段时间有客户向我们提出了更新一下Cesium加载WeServer发布的地图服务的教程&#xff0c;这里为大家更新一下&#xff0c;更新后的Cesium版本号为1.120。 准备工作 在开始之前&#xff0c;需要先准备离线数据发布软件、离线卫星影像与高程示例数据、Cesium开源三维地球源码和…

MyBatis首篇-入门第一文

目录 MyBatis关键特性和概念使用步骤简单示例 核心组件主要特点常见使用情景常见优化策略 MyBatis MyBatis是一个优秀的半自动化持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了大部分JDBC代码和手动设置参数以及获取结果集的繁琐性。用户只需要…

ShardingSphere导致的NPE

1. 项目背景 工程内使用shardingsphere支持分库分表&#xff0c;上层使用的MybatisPlus&#xff0c;有一张表的操作总是报NullPointException。 2. 异常堆栈 ### SQL: INSERT INTO t_tg_message ( update_id, from_id, from_user_name, chat_id, type, data, text, create_…

项目问题 | CentOS 7停止维护导致yum失效的解决办法

目录 centos停止维护意味着yum相关源伴随失效。 报错&#xff1a; 解决方案&#xff1a;将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部&#xff0c;博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…