构建socket的客户端和服务端

news2024/11/27 17:49:05

网络函数

WSAStartup
socket
bind
listen
accept
connect
send
recv
closesocket
WSACleanup

为什么要用WSAStartup初始化?

本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节
下面是官方文档
https://learn.microsoft.com/zh-cn/windows/win32/api/winsock2/nf-winsock2-wsastartup
在这里插入图片描述
以下代码均在本机上实现

服务器

#include<iostream>
#include<WinSock2.h>
#pragma comment (lib,"ws2_32.lib")
#pragma warning (disable:4996)
int main()
{
	//初始化代码
	WORD wVersion = MAKEWORD(2, 2);
	WSADATA wsadata;
	if (WSAStartup(wVersion, &wsadata) != 0)
	{
		return 0;
	}
	//1.socket创建套接字,返回句柄
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	//第一个参数协议簇(AE_INET ,ipv4,AF_INET6,ipv6;AF_UNIX,本机通信)
	//第二个参数类型(SOCK_STREAM,TCP流,SOCK_DGRAM,UDP数据报)
	//第三个参数一般设置0
	if (s == INVALID_SOCKET)
	{
		return 0;///创建套接字失败
	}
	//2、bind/listen 绑定、监听端口
	//端口号用于区别那个应用,比如QQ发送的数据还是浏览器发送的数据
	sockaddr_in add;
	int len = sizeof(sockaddr_in);
	add.sin_family = AF_INET;//协议族
	add.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");//表示接受任意IP地址
	add.sin_port = htons(11111);//网络字节序是大尾方式,本地字节序是小尾方式
	int i = bind(s, (sockaddr*)&add, len);
	listen(s, 5);//瞬间来五个用户
	//3、accept等待别人链接
	//获取客户端IP地址以及端口
	sockaddr_in caddr;
	caddr.sin_family = AF_INET;
	int caddrlen = sizeof(sockaddr_in);
	SOCKET sclient = accept(s, (sockaddr*)&caddr, &caddrlen);
	if (sclient == INVALID_SOCKET)
	{
		return 0;
	}
	int ret = send(sclient, "哎呦",strlen("哎呦"),0);
		closesocket(sclient);
	//反初始化操作
	WSACleanup();
	std::cout << "hello\n";
}
	

客户端

#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main()
{
	//初始化代码
	WORD wVersion = MAKEWORD(2, 2);
	WSADATA wsadata;
	if (WSAStartup(wVersion, &wsadata) != 0)
	{
		return 0;
	}
	//1.socket创建套接字,返回句柄
	SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
	//第一个参数协议族
	//第二个参数类型,什么流
	//第三个,一般设置为0
	if (s == INVALID_SOCKET)
	{
		return 0;//创建失败
	}
	sockaddr_in add;
	int len = sizeof(sockaddr_in);
	add.sin_family = AF_INET;
	add.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//表示接受本机
	add.sin_port = htons(11111);
	//2.connect主动链接服务器
	int i = connect(s, (sockaddr*)&add, len);
	if (SOCKET_ERROR == i)
	{
		return 0;
	}
	//3.接受、发送数据
	char sbuf[256] = { 0 };
	int ret = recv(s, sbuf, 256, 0);
	if (ret == 0)
	{
		return 0;//链接断开
	}
	else if (ret > 0)
	{
		printf(sbuf);
	}
	closesocket(s);
	//反初始化操作
	WSACleanup();
}

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

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

相关文章

Unity中Batching优化的动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…

一对一单聊

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

【深度学习】迁移学习中的领域转移及迁移学习的分类

领域转移 根据分布移位发生的具体部分&#xff0c;域移位可分为三种类型&#xff0c;包括协变量移位、先验移位和概念移位 协变量移位: 在协变量移位的情况下&#xff0c;源域和目标域的边际分布是不同的&#xff0c;即ps(x)∕ pt(x)&#xff0c;而给定x的y的后验分布在域之间…

Android Init系统:引领设备启动的先锋

Android Init系统&#xff1a;引领设备启动的先锋 引言 Init系统是一个操作系统启动的必要组件&#xff0c;负责在启动时初始化所有系统资源、服务和应用程序。在Android设备中&#xff0c;Init系统起到了至关重要的作用&#xff0c;它是启动过程中的第一个进程&#xff0c;负…

mybatis的分页插件

在mybatis核心配置文件中&#xff1a; 这时已经用了SSM整合&#xff0c;好多像是mapper或者数据源等都移出去了 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""…

【Scopus检索】第六届生物技术与生物医学国际学术会议(ICBB 2024)

第六届生物技术与生物医学国际学术会议 2024 6th International Conference on Biotechnology and Biomedicine (ICBB 2024) 第六届生物技术与生物医学国际学术会议&#xff08;ICBB 2024&#xff09;将于2024年03月29日-3月31日在中国-武汉市召开。ICBB 2024将围绕“生物技术…

Word 在页眉或页脚中设置背景颜色

目录预览 一、问题描述二、解决方案三、参考链接 一、问题描述 如何在word的页眉页脚中设置背景色&#xff1f; 二、解决方案 打开 Word 文档并进入页眉或页脚视图。在 Word 2016 及更高版本中&#xff0c;你可以通过在“插入”选项卡中单击“页眉”或“页脚”按钮来进入或者…

2021年度大题:灰太狼的密码

分析&#xff1a;本题主要使用的是素数进行输出&#xff0c;然后难点是如何按照题目要求格式输出。 思路&#xff1a; 第一&#xff1a;我们可以先让素数存给一个一维数组&#xff0c;至于存多少个素数&#xff0c;是矩阵n*n个&#xff0c;控制数量用计数器count即可&#xf…

移动设备安全管理,保护企业数据安全

移动安全管理&#xff08;MSM&#xff09;是一个术语&#xff0c;指的是为保护移动设备及其包含的数据而采取的措施。MSM 可以是主动的&#xff0c;也可以是被动的&#xff0c;具体取决于操作是在设备或数据泄露之前还是之后执行的。主动行动包括使用密码、加密和容器化来保护数…

系统思考与啤酒游戏经营沙盘

结束一家汽车零配件公司《系统思考与啤酒游戏经营沙盘》的内训课&#xff0c;4个小组基本上都有共同的心智模式&#xff0c;这也代表团队有一些集体的盲点。不仅仅对啤酒游戏经营沙盘做了复盘&#xff0c;同时也借用学员画出的系统环路图完成真实案例的研讨以及团队共识&#x…

easyexcel导出报错 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader

报错&#xff1a; org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoaderorg.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWit…

JVM:强软弱虚四种引用

下面依次解释五种引用 一、强引用 把一个对象赋值给一个引用变量&#xff0c;就相当于把这个对象的强引用放到变量中。 只要对象可达&#xff0c; GC一定不会回收这个对象&#xff08;A1&#xff09; 二、软引用 当一个对象&#xff08;A2&#xff09;没有强引用时&#xff…

【React Hooks】=> useId()

相比较使用全局变量 作为唯一 ID 和直接使用 useId 是有区别的。 官方解释如下&#xff1a; 如果是将 useId 作为 id 的情况下&#xff0c;是如下的形式 也就是说你使用了 useId 作为唯一 ID 那么在你删除数组某个元素之后不会导致某个 ID 被重复使用&#xff0c;如果使用的全…

测开速成考点

用户登录界面需要做哪些测试&#xff1f; ⑴功能&#xff1a;  正确的用户名&#xff0c;正确的密码&#xff0c;点击提交按钮&#xff0c;验证能否正确登录 是否跳转正确页面。  错误的用户名 或 密码&#xff0c;点击提交&#xff0c;提示相应的错误信息。  记住用户名…

你知道怎么上网最省钱吗?这样的搭配你不妨试一下。

不知道大家发现了没有&#xff0c;现在越来越多的人开始关注三大运营商推出的保号套餐&#xff0c;您知道这个问题为什么会成为大家关注的话题吗&#xff1f;下面我们一块儿来看一下 现如今&#xff0c;通话是次要的&#xff0c;流量才是王道&#xff0c;生活中的吃衣住行都是需…

[足式机器人]Part4 南科大高等机器人控制课 Ch02 Rigid Body Configuration and Velocity

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch02 Rigid Body Configuration and Velocity 1. Rigid Body Configuration1.1 Special Orthogonal Group1.2 Use of Ro…

观海微电子---触控显示模组一体化效果方案

随着车载电子后视镜及智能魔镜的普及类似镜面一体化要求的产品越来越多&#xff0c;行业熟知的木纹、一体黑、镜面显示都属于触控显示一体化效果。 一体化效果是指显示模组灭屏状态下玻璃盖板显示区域与非显示区域无明显的色差可见的效果&#xff0c;显示模组亮屏后显示仍可见&…

MATLAB机器人对偏导数、雅克比矩阵、行列式的分析与实践

偏导数、雅克比矩阵、行列式都是非常重要的知识点&#xff0c;为了让大家更容易看懂&#xff0c;尽量使用画图来演示。 1、偏导数Partial derivative 对于导数我们已经很清楚了&#xff0c;某点求导就是某点的斜率&#xff0c;也就是这点的变化率。那么偏导数是什么&#xff…

thinkphp todo

来由&#xff1a; 数据库的这个字段我想返回成&#xff1a; 新奇的写法如下&#xff1a; 逻辑层的代码&#xff1a; public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…

idea新建spring boot starter

什么是spring boot starter Spring Boot Starter 是一种 Maven 或 Gradle 依赖&#xff0c;它能够轻松地将相关库和框架集成到 Spring Boot 应用程序中。Starter 是一种对常见依赖项和设置的易于复用的封装&#xff0c;它们通常被开发人员用于创建可插拔的 Spring Boot 应用程序…