用Socket API建立简易TCP服务端、客户端

news2024/12/23 18:48:54

   //----------------------
    //-- 用Socket API建立简易TCP客户端
    // 1 建立一个Socket
    // 2 连接服务器 connect
    // 3 接收服务器信息 recv
    // 4关闭套接字 closesocket
    // -- 用Socket API建立简易TCP服务端
    // 1 建立一个socket
    // 2 bind 绑定用于接受客户端连接的网络端口
    // 3 listen 监听网络端口
    // 4 accept 等待接受客户端连接
    // 5 send 向客户端发送一条数据
    // 6 关闭套接字closesocket
    //----------------------
 

新建工程 ,然后进行如下操作:

输出目录:$(SolutionDir)..\bin\$(Platform)\$(Configuration)\

中间目录:$(SolutionDir)..\temp\$(Platform)\$(Configuration)\$(ProjectName)\

 若代码中不添加#pragma comment(lib,"ws2_32.lib"),则需如下操作:

 socket() 函数

SOCKET WSAAPI socket(
  int af, //地址族规范。 地址族的可能值在Winsock2.h头文件中定义。
  int type,//新套接字的类型规范。
  int protocol//要使用的协议。
);

SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

bind()函数

int bind(
  SOCKET         s,
  const sockaddr *addr,
  int            namelen
);

作用:给socket绑定端口号与具体位置

#define WIN32_LEAN_AND_MEAN //尽力减少一些其他依赖库的引用

#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
//#pragma comment(lib,"ws2_32.lib")

int main() {
	WORD ver = MAKEWORD(2, 2);
	WSADATA dat;
	WSAStartup(ver, &dat);
	//----------------------
	
	// -- 用Socket API建立简易TCP服务端
	// 1 建立一个socket 套接字(地址族规范、新套接字的类型规范、要使用的协议 )
	SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	// 2 bind 绑定用于接受客户端连接的网络端口
	sockaddr_in _sin = {};
	_sin.sin_family = AF_INET;
	_sin.sin_port = htons(4567);//host to net unsigned short
	_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");
	//bind(_sock, (sockaddr *)& _sin, sizeof(_sin));//​作用:给socket绑定端口号与具体位置
	if (SOCKET_ERROR == bind(_sock,(sockaddr*)&_sin,sizeof(_sin))) {
		printf("错误,绑定网络端口失败...\n");
	}
	else {
		printf("绑定网络端口成功...\n");
	}

	// 3 listen 监听网络端口
	//listen(_sock, 5);
	if (SOCKET_ERROR == listen(_sock, 5)) {
		printf("错误,监听网络端口失败...\n");
	}
	else {
		printf("监听网络端口成功...\n");
	}

	// 4 accept 等待接受客户端连接
	sockaddr_in clientAddr = {};
	int nAddrLen = sizeof(sockaddr_in);
	SOCKET _cSock = INVALID_SOCKET;
	_cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);
	if (INVALID_SOCKET == _cSock) {
		printf("错误,接收到无效客户端SOCKET...\n");
	}
	// 5 send 向客户端发送一条数据
	char msgBuf[] = "Hello,我是服务器!";
	send(_cSock, msgBuf, strlen(msgBuf)+1, 0);

	// 6 关闭套接字closesocket 
	closesocket(_sock);
	//----------------------

	//清除Windows socket环境
	WSACleanup();
	return 0;
}

添加while循环

#define WIN32_LEAN_AND_MEAN //尽力减少一些其他依赖库的引用
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
//#pragma comment(lib,"ws2_32.lib")

int main() {
	WORD ver = MAKEWORD(2, 2);
	WSADATA dat;
	WSAStartup(ver, &dat);
	//----------------------
	
	// -- 用Socket API建立简易TCP服务端
	// 1 建立一个socket 套接字(地址族规范、新套接字的类型规范、要使用的协议 )
	SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	// 2 bind 绑定用于接受客户端连接的网络端口
	sockaddr_in _sin = {};
	_sin.sin_family = AF_INET;
	_sin.sin_port = htons(4567);//host to net unsigned short
	_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");
	//bind(_sock, (sockaddr *)& _sin, sizeof(_sin));//​作用:给socket绑定端口号与具体位置
	if (SOCKET_ERROR == bind(_sock,(sockaddr*)&_sin,sizeof(_sin))) {
		printf("错误,绑定网络端口失败...\n");
	}
	else {
		printf("绑定网络端口成功...\n");
	}

	// 3 listen 监听网络端口
	//listen(_sock, 5);
	if (SOCKET_ERROR == listen(_sock, 5)) {
		printf("错误,监听网络端口失败...\n");
	}
	else {
		printf("监听网络端口成功...\n");
	}

	// 4 accept 等待接受客户端连接
	sockaddr_in clientAddr = {};
	int nAddrLen = sizeof(sockaddr_in);
	SOCKET _cSock = INVALID_SOCKET;
	char msgBuf[] = "Hello,我是服务器!";

	while (true) {
		_cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);
		if (INVALID_SOCKET == _cSock) {
			printf("错误,接收到无效客户端SOCKET...\n");
		}
		printf("新客户端加入:IP = %s \n",inet_ntoa(clientAddr.sin_addr));
		// 5 send 向客户端发送一条数据
		send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
	}

	// 6 关闭套接字closesocket 
	closesocket(_sock);
	//----------------------

	//清除Windows socket环境
	WSACleanup();
	return 0;
}

//严重性	代码	说明	项目	文件	行	禁止显示状态
//错误	C4996	'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings	EasyTcpServer	E : \net_c++\EasyTcpServer\server.cpp	51
//解决方案:#define _WINSOCK_DEPRECATED_NO_WARNINGS

运行效果:

 

 

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

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

相关文章

JetBrains Gateway IDEA远程开发

为什么进行远程开发&#xff1f; 无论身处何处数秒内连接至远程环境 充分利用远程计算机的强大功能 在任何笔记本电脑上都可以轻松工作&#xff0c;无论其性能如何。借助远程计算机的计算资源&#xff0c;充分利用最大规模的数据集和代码库。在远程服务器上保护敏感代码 如果…

知识变现海哥|你为什么知识却不富有,是你不懂这个道理

要有价值观念&#xff0c;要有交换思维。商业的本质都是基于价值交换&#xff0c;你能为别人提供多少价值&#xff0c;你就能赚多少米&#xff0c;你帮助别人处理的问题越多你越有价值&#xff0c;你能成就多少人你就能被多少人成就。这是商业行为的底层逻辑。 你没赚到米 一是…

老胡的周刊(第088期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 nginx-ui[2] Nginx 后台管理 UI&#xff1a;…

港联证券|TMT板块全线退潮,这些个股获主力逆市抢筹

计算机、电子、传媒、通讯职业流出规模居前。 今天沪深两市主力资金净流出709.92亿元&#xff0c;其中创业板净流出218.36亿元&#xff0c;沪深300成份股净流出187.92亿元。 资金流向上&#xff0c;今天申万一级职业普跌&#xff0c;除了国防军工职业小幅上涨&#xff0c;获主…

vim编辑器使用教程

文章目录 前言一、vim 的三种工作模式二、vim 基本操作1、编辑2、复制粘贴3、撤销4、跳转5、查找和替换6、自动缩进7、分屏8、其他 三、vim 配置文件 前言 vim 是 Linux 系统内置的「文本编辑器」&#xff0c;用于查看或编辑文件的内容&#xff0c;学会使用 vim 编辑器&#x…

【ros】7.ros导航navigation(定位规划)

物竞天择&#xff0c;优胜劣汰&#xff1b;苟不自新&#xff0c;何以获存。——梁启超 文章目录 :smirk:1. ros导航:blush:2. 2d导航:satisfied:3. 3d导航 &#x1f60f;1. ros导航 ros机器人有个导航功能&#xff0c;类似自动驾驶车辆的规控部分&#xff0c;即根据地图&…

性能测试:深入理解线程数,并发量,TPS,看这一篇就够了

并发数&#xff0c;线程数&#xff0c;吞吐量&#xff0c;每秒事务数&#xff08;TPS&#xff09;都是性能测试领域非常关键的数据和指标。 那么他们之间究竟是怎样的一个对应关系和内在联系&#xff1f; 测试时&#xff0c;我们经常容易将线程数等同于表述为并发数&#xff…

短视频app搭建的技术难点是什么?

近年来&#xff0c;短视频app的流行引起了广泛关注。越来越多的企业开始投入资源来开发短视频app&#xff0c;以满足用户的需求。然而&#xff0c;短视频app的开发过程中&#xff0c;存在许多技术难点需要解决。本文将深入分析短视频app搭建的技术难点。 短视频app的意义 随着…

Centos 7 内核在线升级

目录 一、参考文档 二、升级centos内核 三、centos内核一键升级脚本 一、参考文档 1、内核版本的分类等相关信息见官网&#xff1a;https://www.kernel.org/ 2、 第三方仓库ELRepo参考官网&#xff1a;http://elrepo.org/tiki/HomePage 3、国内yum源&#xff1a;https://…

为什么大量失业集中爆发在2023年?被裁?别怕!失业是跨越职场瓶颈的关键一步!对于牛逼的人,这是白捡N+1!...

被裁究竟是因为自身能力不行&#xff0c;还是因为大环境不行&#xff1f; 一位网友说&#xff1a; 被裁后找不到工作&#xff0c;本质上还是因为原来的能力就配不上薪资。如果确实有技术在身&#xff0c;根本不怕被裁&#xff0c;相当于白送n1&#xff01; 有人赞同楼主的观点&…

如何在视频直播网站开发上集成即时聊天功能

视频直播网站开发需要考虑许多因素&#xff0c;其中一个非常重要的因素是与观众的互动。为了增强观众的参与度和留存率&#xff0c;许多视频直播网站都已经开始集成即时聊天功能。本文将介绍如何在视频直播网站开发上集成即时聊天功能&#xff0c;以提高观众的参与度和留存率。…

SQL Server基础 第五章 函数的使用(日期、字符串、时间、数学、转换等函数)

前言 在SQL Server中提供了许多内置函数&#xff0c;SQL Server中的内置函数就相当于Java、C#等编程语言中的内置API函数。按照函数种类可以分为聚合函数、数学函数、字符串函数、日期函数和时间函数、转换函数和元数据的数6种。在本章中重点讲解比较常用的4种函数&#xff0c…

python从入门到入狱系列-帮你彻底搞懂python的项目实战,爬虫获取NBA成员信息

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

020 - C++ 枚举

今天我们要讲的是 C 中的枚举。 enum 是 enumeration 的缩写&#xff0c;基本上可以说&#xff0c;它就是一个数值集合。如果你想要给枚举一个更实际的定义&#xff0c;它们是给一个值命名的一种方法。 所以我们不用一堆叫做 A、B、C 的整数。我们可以有一个枚举数。它的值是…

Flask 与 Django 先学哪个呢

本文把 Flask 和 Django 做一个比对&#xff0c;因为我对这两个 Python Web 框架都有实际的开发经验。希望我可以帮助您选择学习哪个框架&#xff0c;因为学习一个框架可能会非常耗时 —— 当然也很有趣&#xff01; 相似之处 让我们从相似之处开始。 No. 1 Flask 和 Djang…

ROS学习第二十七节——URDF集成Rviz基本流程

前面介绍过&#xff0c;URDF 不能单独使用&#xff0c;需要结合 Rviz 或 Gazebo&#xff0c;URDF 只是一个文件&#xff0c;需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型&#xff0c;当前&#xff0c;首先演示URDF与Rviz的集成使用&#xff0c;因为URDF与Rviz的集成较之于…

ROS学习第二十八节——URDF之robot link

1.概述 URDF 文件是一个标准的 XML 文件&#xff0c;在 ROS 中预定义了一系列的标签用于描述机器人模型&#xff0c;机器人模型可能较为复杂&#xff0c;但是 ROS 的 URDF 中机器人的组成却是较为简单&#xff0c;可以主要简化为两部分:连杆(link标签) 与 关节(joint标签)&…

数据库基础篇 《11.数据处理之增删改》

1. 插入数据 1.1 实际问题 解决方式&#xff1a;使用 INSERT 语句向表中插入数据。 1.2 方式1&#xff1a;VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 情况1&#xff1a;为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);…

03.初始React脚手架

一.使用create-react-app创建react应用 1.react脚手架 xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查&#xff0c;jsx编译&#xff0c;devServer…&#xff09;下载好了所有相关的依赖可以直接运行一个简单…

硬件还不够!激光雷达「开卷」感知算法+数据闭环

激光雷达正式进入量产周期&#xff0c;而如何用好激光雷达&#xff0c;并形成更优更具性价比的激光雷达系统方案&#xff0c;助力激光雷达量产上车并真正用好激光雷达系统&#xff0c;将是接下来两年激光雷达赛道的主要方向。 在近期开幕的上海国际车展上&#xff0c;亮道智能…