C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端

2024-05-12 20:52

本文主要是介绍C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       客户端的程序结构前半部分与服务器端基本相同,后半部分也相对简单。相关函数的解释可以参考前文服务器端的内容。有关客户端的内容除个别地方外,就不再做长篇大论的解释。强调一点,如果将此程序移到其它电脑上运行,编译需要release模式,具体做法可以参考上一篇。
      客户端程序简介如下:
      一、头文件部分

#include<iostream>
using namespace std;
#include<thread>
#include <WinSock2.h>         
#pragma comment(lib,"ws2_32.lib")
#pragma warning (disable: 4996) //解决C4996报错问题

    二、声明函数及全局变量

void clientRecv();
void clientSend();
SOCKET pubServerSock; //服务器端SOCKET对象(客户端需与服务器端联系)

    三、主函数编写(客户端与服务器端链接的具体步骤)

int main(void)
{

   步骤1. 窗口设置

	system("color 1A");system("title Client Station");system("mode con cols=60 lines=30");

   步骤2. 打开网络库

	WORD wdVersion = MAKEWORD(2, 2); WSADATA wdSockMsg;int nRes = WSAStartup(wdVersion, &wdSockMsg);if (0 != nRes){cout << "网络库打开过程失败,程序即将结束!" << endl;system("pause");return 0; }

  步骤3. 检验网络库版本号

	if (2 != HIBYTE(wdSockMsg.wVersion) || 2 != LOBYTE(wdSockMsg.wVersion)){cout << "网络库版本有误,程序即将结束!" << endl;system("pause");WSACleanup();return 0;}

  步骤4. 创建服务器端SOCKET对象(便于客户端联系服务器)

	pubServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == pubServerSock){cout << "创建服务器端SOCKET对象失败,程序即将结束!" << endl;system("pause");WSACleanup();return 0;//结束程序运行}printf("已与服务器连接...\n");

  步骤5. 链接到服务器(关于IP地址:客户端填写IP地址等也是服务器端的,注意事项参考前文

	sockaddr_in serverSockAdd;serverSockAdd.sin_family = AF_INET;serverSockAdd.sin_port = htons(12345); //端口号与服务器程序保持一致serverSockAdd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//同上int res = connect(pubServerSock, (struct sockaddr*)&serverSockAdd, sizeof(serverSockAdd));if(SOCKET_ERROR == res){cout << "链接服务器失败,程序即将结束!" << endl;system("pause");closesocket(pubServerSock);WSACleanup();return 0;}

   步骤6. 与服务器接收、发送消息。

	thread clientThread1(clientRecv); //利用多线程类调用子程序thread clientThread2(clientSend); //利用多线程类调用子程序clientThread1.join();clientThread2.join();

  步骤7. 程序结束

	closesocket(pubServerSock);WSACleanup();system("pause");return 0;
}

  四、子程序实现
  1. 收信息子程序

void clientRecv()
{while (true){char buf[1024] = { 0 };int res = recv(pubServerSock, buf, 1024 - 1, 0);if (SOCKET_ERROR == res || 0 == res){cout << "程序运行失败或链接中断!" << endl;closesocket(pubServerSock);WSACleanup();system("pause");exit(0);}else{cout << buf << endl;}}
}

2. 发信息子程序

void clientSend()
{while (true){string buf;cin >> buf;int res = send(pubServerSock, buf.c_str(), strlen(buf.c_str()), 0);if (SOCKET_ERROR == res){cout << "程序运行失败或链接中断。。。" << endl;closesocket(pubServerSock);//		closesocket(pubClientSock);WSACleanup();system("pause");exit(0);}}
}

五、运行结果截图

这篇关于C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983712

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决