基于TCP&socket的CS通信(C++)

C/C++用socket实现简单的TCP文件传输 本文主要用于总结学习到的关于socket网络编程的知识以及回顾项目原理等相关内容,进一步加深了对于TCP通信与实际项目之间联系的理解,也欢迎各位大佬对于文章中的错误理解进行批评指正以及对进一步完善所需要学习了解的知识原理给出重要建议 阅读详情

服务端

  1. socket() 创建套接字
  2. bind() 将套接字绑定在本机地址和端口
  3. listen() 监听,并等待客户端接入
  4. accept() 接受客户端请求
  5. recv()/send() 通信
  6. close() 关闭套接字

客户端

  1. socket() 创建套接字
  2. connect() 向服务器端发送连接请求
  3. recv()/send() 通信
  4. close() 关闭套接字

服务端:

#include<iostream>
using namespace std;
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>
#include<string>


int main(){
	//1.确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (HIBYTE(wsaData.wVersion) != 2 || LOBYTE(wsaData.wVersion) != 2){
		cout << "确定版本协议失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "确定版本协议成功!" << endl;

	//2.创建socket
	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (serverSocket == SOCKET_ERROR){
		cout << "创建socket失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "创建socket成功!" << endl;


	//3.设置服务器地址簇
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = inet_addr("10.181.73.111");
	addr.sin_port = htons(9527);

	//4.绑定
	int r = bind(serverSocket, (sockaddr*)&addr, sizeof(addr));
	if (r == -1){
		cout << "绑定失败: " << GetLastError() << endl;
		WSACleanup();
		return -1;
	}
	cout << "绑定成功!" << endl;

	//5.监听
	r = listen(serverSocket, 10);
	if (r == -1){
		cout << "监听失败: " << GetLastError() << endl;
		WSACleanup();
		return -1;
	}
	cout << "监听成功!" << endl;

	//6. 接受连接
	SOCKADDR_IN clientAddr = { 0 };
	int len = sizeof(clientAddr);
	SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &len);
	if (clientSocket == SOCKET_ERROR){
		cout << "客户端连接失败:" << GetLastError() << endl;
		closesocket(serverSocket);
		WSACleanup();
		return -1;
	}
	cout << "客户端连接成功" << endl;

	// 7. 通信
	char buff[1024];
	while (1){
		r = recv(clientSocket, buff, 1023, NULL);
		if (r > 0){
			buff[r] = 0;
			cout << "来自客户端的消息:" << buff << endl;
		}
	}

}

客户端:

#include<iostream>
using namespace std;
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>
#include<string>


int main(){
	//1.确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (HIBYTE(wsaData.wVersion) != 2 || LOBYTE(wsaData.wVersion) != 2){
		cout << "确定版本协议失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "确定版本协议成功!" << endl;

	//2.创建socket
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (clientSocket == SOCKET_ERROR){
		cout << "创建socket失败: " << GetLastError() << endl;
		return -1;
	}
	cout << "创建socket成功!" << endl;


	//3.设置服务器地址簇
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = inet_addr("10.181.73.111");
	addr.sin_port = htons(9527);

	//4. 连接
	int r = connect(clientSocket, (sockaddr*)&addr, sizeof(addr));
	if (r == -1){
		cout << "服务器连接失败" << GetLastError() << endl;
		closesocket(clientSocket);
		WSACleanup();
		return -1;
	}
	cout << "服务器连接成功!" << endl;

	// 5. 通信
	char buff[1024];
	while (1){
		cout << "输入你发送的消息:";
		cin >> buff;
		send(clientSocket, buff, strlen(buff), NULL);
		}
	}



int sendToServer(char *m_pDataBuffer,int sendDataLen)
{
    /* 创建一个 socket 用于 tcp 通信 */
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
		return ERROR;
    }

    /* 连接服务器 */
    if (connect(sockfd, (struct sockaddr *) &ServerAddr, sizeof(ServerAddr)) != 0)
    {
		close(sockfd);
		return ERROR;
    }

	int retLen = writen(sockfd, m_pDataBuffer, sendDataLen);
    if(retLen != sendDataLen)
	{
		SAFE_CLOSE(sockfd);
		return ERROR;
    }

	fd_set readset;
	struct timeval tv_read;
	int ret = 0;

	while(1)
	{
		FD_ZERO(&readset);
		FD_SET(sockfd, &readset);
		tv_read.tv_sec = 1;
		tv_read.tv_usec = 0;
		ret = select(sockfd+1, &readset, NULL, NULL, &tv_read);

		if(ret < 0)
		{
			backret = ERROR;
			goto outExit;
		}
		else if (ret == 0)
		{
			backret = ERROR;
			goto outExit;
		}
		else
		{		
			usleep(200*1000);
			memset(recvBuf, 0, 1024);
			len = HPR_Recv(sockfd, recvBuf, 1024);
			if (len == 0)
			{
				backret = ERROR;
				goto outExit;
			}
			else if (len < 0)
			{
				backret = ERROR;
				goto outExit;
			}
		}		
	}    

outExit:
    close(sockfd);
    return backret;
}
创建一个简单的VC++ Socket程序 本文主要结合MSDN上关于WinSocket的几篇官方文档,创建一个简单的VC++ Socket示例程序,演示一个基本的CS模型。参考链接如下:         MSDN:Windows Socket 2    Getting Started with WinSocket         其他博客:VC网络编程 一、C/S —— Client和Server         网络 阅读详情

相关推荐

C++——TCP的socket通信

1.TCP流程 TCP编程的服务器端一般步骤是:   1、创建一个socket,用函数socket();   2、设置socket属性,用函数setsockopt(); * 可选   3、绑定IP地址、端口等信息到socket上,用函数bind();   4、开启监听,用函数listen();   5、接收客户端上来的连接,用函数accept();   6、收发数据,用函数send(...

Map的博客 1461

C++基于TCP的SOCKET通信

C++基于TCP的SOCK通信,从原理出发,理论与代码相结合,清晰易懂

lijingheng66的博客 4336

别再自己写消息提示了!5分钟用WPF+Material Design打造专业级Snackbar(支持.NET 6)

本文为WPF开发者提供了一份快速集成专业级Snackbar消息提示的实战指南。通过引入MaterialDesignThemes开源库,在.NET 6 WPF项目中,仅需5分钟即可告别传统的MessageBox,实现遵循Material Design规范、动画流畅、支持队列管理的非侵入式Snackbar控件,显著提升应用的用户体验与现代化交互水平。

year5的博客 172

C++实现CS模型(计算机网络)

文章目录UDP实现CSUDP_server创建、初始化socket准备接受数据开始接/发数据UDP_client创建、初始化socket准备接受数据开始发/接数据TCP实现CSTCP_Client创建、初始化socket创建连接&准备发/收数据TCP_Server创建、初始化socket接受数据发送数据Source codeUDP_serverUDP_ClientTCP_ClientTCP_server 阿里嘎多,来为计网实验做个准备 本文代码运行环境为 linux系统 你可以在我的github仓

FFengJay的博客 2832

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 554

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2394

socket库c++模型设计和实现

5.4.1案例:socket库c++模型设计和实现企业信息系统框架集成第三方产品 案例背景:一般的企业信息系统都有成熟的框架。软件框架一般不发生变化,能自由的集成第三方厂商的产品。案例需求:请你在企业信息系统框架中集成第三方厂商的Socket通信产品和第三方厂商加密产品。第三方厂商的Socket通信产品:完成两点之间的通信;第三方厂商加密产品:完成数据发送时加密;数据解密时解密。】案例要求:   ...

小强博客 2571

AutoCAD 2024 LISP实用技巧:自定义快捷命令与高效绘图工具集

本文详细介绍了如何在AutoCAD 2024中部署和使用LISP脚本,打造高效绘图工具集。通过自定义快捷命令,如WFF(超级文字查找替换)、GQT(图层隔离)和LLTJ(智能长度统计),可大幅简化图层管理、文字编辑和测量统计等重复性操作,显著提升绘图效率。

gan8painter的博客 318

C++项目实战-socket编程

假设我们让发送数据的一端总是以大端字节序发送(对就是做一个统一的规定),那么接收数据的一端就知道我接受到的字节序总是大端字节序,如果接受方的字节序为小端,那么只需要大端数据装换成小端字节序就可以了。因此,Linux定义了下面这个新的通用的socket地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的【内存对齐可以加快CPU访问速度,内存对齐问题见我的C语言专栏,有详细介绍】socket本意上“插座”的意思,在Linux环境中,用于表示进程间网络通信的特殊文件类型。...

weixin_46120107的博客 1万+

高通平台Android稳定性调试笔记:手把手教你用T32、Crash Utility分析Kernel Panic与RAM Dump

本文详细介绍了高通平台Android内核崩溃的分析方法,包括使用T32 Simulator和Crash Utility工具链解析Kernel Panic与RAM Dump。从环境配置、dump文件预处理到高级调试技巧,手把手教你如何定位和解决Android系统崩溃问题,特别适用于MSM/SA8155平台的开发者。

weixin_42543046的博客 527

[RK3568 Android11] 开发之调试RK809 codec音频-SPK喇叭

目录 前言 一、注册声卡顺序 二、SPK喇叭路由配置 三、tinyalsa调试工具 前言 瑞芯微RK809是一种复杂的功率管理集成电路(PMIC)集成编解码器,适用于由外部电源供电的多核系统应用;同时它也集成了音频编解码器,这样在硬件设计上可以直接使用RK809 codec功能,不必再外挂个其他codec芯片;RK809 codec不仅支持SPK,还支持耳机,MIC功能; 一、注册声卡顺序 设备树dts里面原厂帮我们配置好了rk809_sound,我们直接...

~未来可期~ 7412

Socket架构基于CS的网络编程

TCP/IP协议 结构: 1.SMTP(简单邮件传输协议) 2.NNTP(网络新闻传输协议) 3.HTTP(超文本传输协议) TCP/IP用IP地址来标识源地址和目的地址 在Java中的使用 需导入 java.net.*;//用于网络连接 java.io.*;//用于数据传输 import java.io.*; import java.net.*; public class URLReader{//作用:打印网页的源代码 public static void main

Java学习 663

YOLOv13改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 已更新种不同的改进方案,专栏内的每篇文章皆,均可顺利运行。2️⃣ 订阅专栏即可进群获取以及从的各种答疑内容。3️⃣ 全新的YOLOv13改进专栏,,只为更好的满足论文发表的要求。专栏内容,专栏实时评分,全网最高,质量保证。🎫。。

Limiiiing的博客 9151

Socket常用函数及简单实现C/S模型

阻塞等待客户建立连接,成功的话,返回一个与客户端成功连接的socket文件描述符。listen():设置监听上限,同时建立连接的上限数。设置同时与服务器建立连接的上限数。(同时进行3次握手的客户端数量)connect():客户端绑定ip+port。accpet():阻塞监听客户端连接。使用现有的socket与服务器建立连接。注:bind()绑定ip+port。给socket绑定一个地址结构(socket实现server端。socket实现client端。

BSY丶的博客 849

Apollo Planning决策规划算法代码详细解析 (2):Scenario执行

上一章节讲Scenario的决策逻辑,当确认当前Scenario后,本章节继续深入讲解在代码中,Scenario的执行过程。Scenario的Process()函数根据配置文件顺序执行stage,并判断目前处于哪个stage。当确认好stage后调用该stage对应的Process()函数,来进行具体的规划任务。 码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: Scenario的Process()函数的作用于调用方式; Scenario对象的初始化方法; 如何给每个Scen

自动驾驶Player的博客 5609

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Socket网络编程(一)——网络通信入门&基本概念

在计算机领域中,网络是信息传输、接收、共享的虚拟平台在通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享网络是人类发展史来最重要的发明,提高了科技和人类社会的发展网络编程从大的方面说就是对信息的发送到接收通过操作相应Api调度计算机硬件资源,并利用传输管道(网络)行数据交换的过程简单来说是IP地址与端口的结合协议(RFC 793 )一种地址与端口的结合描述协议TCP/IP协议的相关API的总称;是网络Api的集合实现。

不愿意做鱼的小鲸鱼の博客 1702

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++网络编程(一)本地socket通信

简单描述C++网络通信中,采用socket连接客户端与服务器端的方法,以及过程中所涉及的函数概要与部分函数使用细节

QYQHxyh的博客 5457

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C/C++socket网络编程

socket多进程编程,tcp和udp流程图,socket函数, bind函数,listen函数,accept函数,connect函数,recv、recvfrom、read函数,send、write、sendto、sendmsg函数,close、shutdown函数,htonl、ntohl、htons、ntohs本地主机和网络字节序转换,inet_addr、inet_aton、inet_ntop,IP地址转换,setsockopt,fcntl,getpeername与getsockname

weixin_40355471的博客 9269

C/C++Socket实现实时通讯(附源码)

使用C++语言实现跨设备交互

起床气233的博客 1443

TCP/UDP Socket编程(包含C++具体实现代码)

应用进程与端到端传输协议(TCP或UDP)之间的门户:从一个进程向另一个进程可靠地传输字节流服务器首先运行,等待连接建立1:服务器进程必须先处于运行状态创建客户端主动和服务器建立连接:2:创建客户端本地套接字(隐式捆绑到本地port)3 :当与客户端连接请求到来时服务器接受来自用户端的请求,解除阻塞式等待,返回一个新的(与欢迎socket不一样),与客户端通信4:连接API调用有效时,客户端P与服务器建立了TCP连接TCP在客户端和服务器进程之间提供了可靠的、字节流(管道)服务。

m0_50997714的博客 1386

c/c++实现 TCP Socket网络通信

重要点固定长度控制消息 () 避免 TCP 粘包/拆包问题。约定 PUSH → 发送数据长度 → 数据内容 → PULL 响应 → 客户端处理。设计目的双方通信流程标准化,客户端/服务端可以正确解析数据。#define CTRL_MSG_MAX 16 // 固定长度控制消息#define CTRL_MSG_PUSH "PUSH" // 客户端发送数据请求#define CTRL_MSG_PULL "PULL" // 服务端响应通知客户端可以处理结果。

weixin_40820983的博客 1266

Socket编程(简单(C++)实现TCP通信)

一、什么是socket? socket顾名思义就是套接字的意思,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。 socket编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW),前两者较常用。基于TCP的socket编程是流式套接字。 二、TCP/IP协议 要理解socket必须的得理解tcp/ip,它们之间好比送信的线路和驿站的作用,比如要建议送信驿站,必须得了解送信的各个细节。 .

一包辣条包邮!的博客 1万+

【C++网络编程】Socket基础:网络通讯程序入门级教程

本篇博文介绍了C++网络编程的基础知识,从Socket基础到Epoll的使用,为初学者提供了入门级的教程。读者将学习如何创建套接字、建立连接、发送和接收数据,并深入了解Epoll在高性能网络编程中的应用。

朝花夕拾 7637

【C++】使用C++实现基于Socket的通信

Socket是一种网络通信接口,它提供了端到端的通信服务。Socket分为TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)两种类型。TCP是面向连接的、可靠的、基于字节流的传输层通信协议,而UDP则是无连接的、不可靠的、基于数据报的传输层通信协议。// Type部分,通常使用16位整型// Length部分,也是16位整型// Value部分,使用字节向量存储。

kewaqi618的博客 3836

2024年C C++最新Linux-socket编程以及TCP、UDP实例_c udp msghdr实例(5),2024年最新如何成为杰出的程序员

接受连接从队列中接受一个连接发起连接关闭连接tcp数据读写flag 有一些特别的参数持续监听对方的回应不经过路由表对socket非阻塞发送紧急数据不接受sig信号等等udp数据读写通用数据读写msg_iov;void带外标记判断地址信息函数//本端的地址信息//远端的地址信息socket选项获取socket选项设置socket选项这个可以查看手册。

2401_84973528的博客 1285

C++中TCP服务端程序

socket套接字:表示通信的端点。就像用电话通信,套接字相当于电话,IP地址相当于总机号码,而端口号则相当于分机号码。指定通信的协议族,常见的有:- AF_INET:IPv4 协议。- AF_INET6:IPv6 协议。- AF_LOCAL 或 AF_UNIX:本地通信(同一台计算机上的进程间通信)。- AF_PACKET:底层网络通信,允许访问物理层,如以太网帧。指定套接字的类型,常见的有:- SOCK_STREAM:面向连接的字节流套接字(TCP),保证数据的顺序和可靠传输。

weixin_45429924的博客 2981
上一篇: 字符串最后一个单词的长度
下一篇: 分布式存储之ceph
m_0806
博客等级 码龄7年 25粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值