socket编程(C++/Windows)

相关文章推荐:

Socket 编程基础

面试官,不要再问我三次握手和四次挥手

TCP的三次握手与四次挥手

参考视频:

https://www.bilibili.com/video/BV1aW4y1w7Ui/?spm_id_from=333.337.search-card.all.click

 

TCP通信流程

330bf60ffd5e44e9998580d07ab425aa.png

 

服务端

#include<iostream>
#include<cstring>
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main(void)
{
	//Windows上使用网络功能需要开启网络权限
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	//1.创建socket套接字
	//SOCKET socket{
	//	int af,         //协议地址簇 IPV4/IPV6 AF_INET/AF_INET6
	//	int type,		//类型 流式协议/帧式协议 SOCK_STREAM/SOCK_DGRAM
	//	int protocol	//保护协议 0
	//};
	SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (listen_socket == INVALID_SOCKET) {
		cerr << "error" << endl;
		return -1;
	}

	//2.给这个socket绑定一个端口号
	//struct sockaddr_in {
	//	ADDRESS_FAMILY sin_family;	//协议地址簇
	//	USHORT sin_port;			//端口号
	//	IN_ADDR sin_addr;			//IP地址
	//	CHAR sin_zero[8];			//保留字节
	//};
	struct sockaddr_in local = { 0 };
	local.sin_family = AF_INET;
	local.sin_port = htons(9999);		//大小端问题 中间设备使用的是大端序(路由器)
	local.sin_addr.s_addr = INADDR_ANY;	//表示接受任意网卡的数据	

	//bind(
	//	SOCKET s,
	//	const struct sockaddr* name,
	//	int namelen
	//);
	if (bind(listen_socket, (struct sockaddr*)&local, sizeof local) == INVALID_SOCKET) {
		cerr << "error" << endl;
		return -1;
	}

	//3.给这个socket开启监听属性
	//listen(
	//	SOCKET s,
	//	int backlog
	//);
	if (listen(listen_socket, 128) == -1) {
		cerr << "error" << endl;
		return -1;
	}

	//4.等待客户端连接
	// 返回的客户端socket才是跟客户端可以通讯的socket
	// 阻塞函数,等到有客户端连接进来就接受连接,然后返回,否则就阻塞
	//accept(
	//	SOCKET s,
	//	struct sockaddr* addr,
	//	int* addrlen
	//);
	while (true) {
		SOCKET client_socket = accept(listen_socket, nullptr, nullptr);
		if (client_socket == INVALID_SOCKET) {
			continue;
		}
		//5.开始通讯(B/S)
		//recv(
		//	SOCKET s,		 //客户端socket
		//	char* buf,		 //要接受的数据存储的位置
		//	int len,		 //接受的长度
		//	int flags		 //0
		//);
		//send(
		//	SOCKET s,		 //客户端socket
		//	const char* buf, //要发送的数据存储的位置
		//	int len,		 //长度
		//	int flags		 //0
		//);
		char buffer[1024] = { 0 };
		int ret = recv(client_socket, buffer, sizeof buffer, 0);
		cout << buffer << endl;
		send(client_socket, buffer, strlen(buffer), 0);

		//6.关闭连接
		closesocket(client_socket);
	}
	

	return 0;
}

 

客户端

#include<iostream>
#include<cstring>
#include<Winsock2.h>
#include<WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;


int main(void)
{
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	//1.创建socket套接字
	SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (client_socket == INVALID_SOCKET) {
		cerr << "error" << endl;
		return -1;
	}

	//2.连接服务器
	struct sockaddr_in target;
	target.sin_family = AF_INET;
	target.sin_port = htons(9999);		//与服务端端口一致
	inet_pton(AF_INET, "127.0.0.1", &target.sin_addr.s_addr);	//转换本地环回地址
	//target.sin_addr.s_addr = inet_addr("127.0.0.1");

	//connect(
	//	SOCKET s,
	//	const struct sockaddr* name,
	//	int namelen
	//);
	if (connect(client_socket, (struct sockaddr*)&target, sizeof target) == INVALID_SOCKET) {
		cerr << "error" << endl;
		closesocket(client_socket);
		return -1;
	}

	//3.开始通讯 send recv
	while (true) {
		char buffer1[1024] = { 0 };
		cout << "enter: ";
		cin >> buffer1;
		send(client_socket, buffer1, strlen(buffer1), 0);

		char buffer2[1024] = { 0 };
		int ret = recv(client_socket, buffer2, sizeof buffer2, 0);
		if (ret <= 0) {
			break;
		}
		cout << buffer2 << endl;
	}

	//4.关闭连接
	closesocket(client_socket);

	return 0;
}

 

 

服务端完整代码

#include<iostream>
#include<cstring>
#include<WinSock2.h>
#include<thread>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main(void)
{
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (listen_socket == INVALID_SOCKET) {
		cerr << "error" << endl;
		return -1;
	}

	struct sockaddr_in local = { 0 };
	local.sin_family = AF_INET;
	local.sin_addr.s_addr = INADDR_ANY;
	local.sin_port = htons(9999);
	
	if (bind(listen_socket, (struct sockaddr*)&local, sizeof local) == INVALID_SOCKET) {
		cerr << "error" << endl;
		return -1;
	}

	if (listen(listen_socket, 128) == -1) {
		cerr << "error" << endl;
		return -1;
	}

	while (true){
		SOCKET client_socket = accept(listen_socket, nullptr, nullptr);
		if (client_socket == INVALID_SOCKET) {
			continue;
		}
        cout << "client connect: " << client_socket << endl;		

		thread th([](SOCKET client_socket){
			while (true) {
				char buffer[1024] = { 0 };
				int ret = recv(client_socket, buffer, sizeof buffer, 0);
				if (ret <= 0) {
					cout << "client disconnect: " << client_socket << endl;
					break;
				}
				cout << buffer << endl;
				send(client_socket, buffer, strlen(buffer), 0);
			}
			closesocket(client_socket);
		}, client_socket);

		th.detach();
	}

	return 0;
}

 

客户端完整代码

#include<iostream>
#include<cstring>
#include<Winsock2.h>
#include<WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main(void)
{
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (client_socket == INVALID_SOCKET) {
		cerr << "error" << endl;
		return -1;
	}

	struct sockaddr_in target;
	target.sin_family = AF_INET;
	target.sin_port = htons(9999);
	inet_pton(AF_INET, "127.0.0.1", &target.sin_addr.s_addr);

	if (connect(client_socket, (struct sockaddr*)&target, sizeof target) == INVALID_SOCKET) {
		cerr << "error" << endl;
		closesocket(client_socket);
		return -1;
	}

	while (true) {
		char buffer1[1024] = { 0 };
		cout << "enter: ";
		cin >> buffer1;
		send(client_socket, buffer1, strlen(buffer1), 0);

		char buffer2[1024] = { 0 };
		int ret = recv(client_socket, buffer2, sizeof buffer2, 0);
		if (ret <= 0) {
			cout << "server disconnect." << endl;
		}
		cout << buffer2 << endl;

	}
	closesocket(client_socket);

	return 0;
}

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux自动化一键批量检查主机端口

1、准备 我们可以使用下面命令关闭一个端口 sudo iptables -A INPUT -p tcp --dport 端口号 -j DROP我关闭的是22端口&#xff0c;各位可以关其它的或者打开其它端口测试&#xff0c;谨慎关闭22端口&#xff01;不然就会像我下面一样握手超时&#x1f62d;&#x1f62d;&…

实验五 时序逻辑电路部件实验

一、实验目的 熟悉常用的时序逻辑电路功能部件&#xff0c;掌握计数器、了解寄存器的功能。 二、实验所用器件和仪表 1、双 D触发器 74LS74 2片 2、74LS162 1片 3、74194 1片 4、LH-D4实验仪 1台 1.双…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时&#xff0c;Flask 会调用对应的视图函数来处理请求 def index():return …

WPF使用OpenCvSharp4

WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中&#xff0c;右键单击项目名称&#xff0c;选择“管理 NuGet 包”。搜索并安装以下包&#xff1a; OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…

社媒运营专线 - SD-WAN 跨境网络专线 —— 外贸企业社媒平台的专属 “快车道”

在当今全球化的商业浪潮中&#xff0c;社交媒体平台已成为外贸企业拓展国际市场、提升品牌知名度和促进业务增长的关键阵地。然而&#xff0c;网络访问速度慢、IP 不纯净等问题却如影随形&#xff0c;严重制约了企业社媒运营的效率和效果。幸运的是&#xff0c;社媒运营专线 - …

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

代码随想录算法【Day4】

Day4 1.链表的题目&#xff0c;要在草稿纸上模拟清晰后就简单了 2.双指针更加灵活的应用。 3.环形链表多练习。 24. 两两交换链表中的节点 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* _dummyHead new ListNode(0); //虚拟头结点_dummyHead…

计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价格 预测 机器学习 深度学习 Python爬虫 HDFS集群

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

win11中win加方向键失效的原因

1、可能是你把win键锁了&#xff1a; 解决办法&#xff1a;先按Fn键&#xff0c;再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了&#xff0c;只需要将其打开就好了

Unity自定义Inspector属性名特性以及特性自定义布局问题

前言&#xff1a; 在Unity中编辑属性的适合&#xff0c;一般都是显示属性的英文&#xff0c;如果想要改成中文的话又不能改变属性名&#xff0c;那么自定义特性是很好的选择。 一、自定以特性 这一块没有什么要多说的&#xff0c;就是自定义特性 using UnityEngine; #if UNI…

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…

普通人怎么入门学习并使用AI?

前言 作为普通人看着AI一天一天变革&#xff0c;心急如焚&#xff0c;未来但是就是不知道怎么才算真正进入了AI&#xff0c;使用AI....作为从头至尾追随AI脚步的码农有几点小建议~ 一、&#x1f4bb;使用 AI 网站或软件&#xff0c;解决实际问题 不管用哪种AI&#xff0c;先用…

洛谷 P1725:琪露诺 ← 单调队列+DP

【题目来源】https://www.luogu.com.cn/problem/P1725【题目描述】 在幻想乡&#xff0c;琪露诺是以笨蛋闻名的冰之妖精。 某一天&#xff0c;琪露诺又在玩速冻青蛙&#xff0c;就是用冰把青蛙瞬间冻起来。但是这只青蛙比以往的要聪明许多&#xff0c;在琪露诺来之前就已经跑到…

SDL单设备登录

SDL单设备登录 需求&#xff1a;当账户在其他地方登录时&#xff0c;当前已登录账户会被顶下线 核心思路&#xff1a; 前后端建立WebSocket连接&#xff0c;当客户端登录账户&#xff0c;根据用户id保存Socket连接&#xff0c;如果该用户已有保存的连接&#xff0c;则通知下线…

MySQL数据库函数——日期函数

常用的日期函数 函数功能curdate()返回当前日期curtime()返回当前时间now()返回当前日期和时间year(date)获取指定date的年份month(date)获取指定date的月份day(date)获取指定date的日期date_add(date,interval expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值d…

基于MATLAB的冰箱水果保鲜识别系统

摘要&#xff1a;本作品旨在研究和实现基于MATLAB软件的冰箱水果保鲜识别系统&#xff0c;针对多种常见水果混合的图像进行处理和识别。首先&#xff0c;根据水果与背景的差异选择合适的阈值&#xff0c;对图像进行去噪和对比度增强&#xff0c;然后进行二值化处理。接下来&…

谷歌地球引擎GEE计算NDVI与NDWI的年平均值的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;基于哨兵2号遥感影像数据&#xff0c;计算某一指定区域NDVI、NDWI等指标的年平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;…

《机器视觉:开启智能新时代》

《机器视觉&#xff1a;开启智能新时代》 一、机器视觉&#xff1a;工业之眼的崛起二、核心组件&#xff1a;构建精准视觉系统&#xff08;一&#xff09;光源&#xff1a;照亮视界的画笔&#xff08;二&#xff09;镜头&#xff1a;聚焦精准的慧眼&#xff08;三&#xff09;相…

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…