c++ windows下基于TCP的socket编程 入门

2023-11-03

服务器端:

  1. socket() ——创建1个socket
  2. bind() ——绑定IP地址、端口号等信息到socket上
  3. listen() ——监听,设置允许最大连接数
  4. accept() ——接受客户端的请求连接
  5. send() 和 recv() / read() 和 write() ——收发数据
  6. closesocket()——关闭网络连接
//服务器 server.cpp

#define _WINSOCK_DEPRECATED_NO_WARNINGS 
//inet_ntoa()函数已经过期,推荐使用inet_ntop()函数或者InetNtop()函数来替代该过期函数,或者定义_WINSOCK_DEPRECATED_NO_WARNINGS来不显示这个告警信息

#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "ws2_32.lib")
//为了包含头文件WinSock2进行各种函数的调用(WSAstarup),链接到ws2_32.lib

void main()
{
	/* 1. 加载 WinSock 库 */
	WSADATA wsaData;
	//WSADATA这个结构被用来存储 被WSAStartup函数调用后返回的Windows Sockets数据
	int port = 5099;

	char buf[] = "Server: hi, I am a server......";

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		//搜索相应的Socket库并绑定,执行成功返回0  版本2.2
		printf("failed"); return ;
	}

	/* 2. 创建用于监听的套接字 socket() */
	SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
	//参数:AdressFamily地址类型ipv4 | 数据传输方式SOCK_STREAM 和 SOCK_DGRAM数据报 | 传输协议(系统可自动推断)

	/* 3. 配置监听的地址和端口 */
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(port);//1024以上的端口号
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	//addrSrv.sin_addr.S_un.S_addr = htons(INADDR_ANY); 都可
	//htones将主机字节顺序转换为网络字节顺序

	/* 4. 服务器绑定监听socket:bind()  listen()*/
	int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));
	if (retVal == SOCKET_ERROR) {
		printf("fail bind:%d\n", WSAGetLastError());
		return ;
	}
	if (listen(sockSrv, 10) == SOCKET_ERROR) {
		printf("fail listen:%d\n", WSAGetLastError());
		return ;
	}
	/* 5. 服务端accept等待客户端连接 ( 客户端连接connect) */
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
	SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrClient, &len);
	if (sockConn == SOCKET_ERROR) {
		printf("accept failed:%d", WSAGetLastError());
	}
	printf("accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr));

	/* 6. 发送接收数据 */
	//发送数据
	int iSend = send(sockConn, buf, sizeof(buf), 0);
	if (iSend == SOCKET_ERROR) printf("send failed");

	//接收数据
	char recvBuf[100];
	memset(recvBuf, 0, sizeof(recvBuf));
	recv(sockConn, recvBuf, sizeof(recvBuf), 0);
	printf("%s\n", recvBuf);

	/* 7. 关闭socket*/
	closesocket(sockConn);

	closesocket(sockSrv);
	WSACleanup();
	system("pause");
}

客户端 :

  1. socket()——创建1个socket
  2. 设置要连接的服务端的IP地址、端口等属性
  3. connect()——连接服务器
  4. send() 和 recv() / read() 和 write() ——收发数据
  5. closesocket()——关闭网络连接
//客户端 client.cpp

#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include<WinSock2.h>
#include<stdio.h>

#pragma comment(lib, "ws2_32.lib")

void main()
{
	/* 1. 加载 WinSock 库 */
	WSADATA wsaData;
	char buff[1024];
	memset(buff, 0, sizeof(buff));
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		printf("failed to load Winsock");
		return;
	}

	/* 2. 创建用于通讯的套接字 socket() */
	SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
	if (SOCKET_ERROR == sockClient) {
		printf("Socket() error:%d", WSAGetLastError());
		return;
	}

	/* 3. 设置要连接的服务端的ip地址,端口等属性*/
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(5099);
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	/* 4. 向服务器发送连接请求*/
	if (connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {
		printf("Connect falied:%d", WSAGetLastError());
		return;
	}
	
	/* 5. 接收,发送数据*/
	//接收数据
	recv(sockClient, buff, sizeof(buff), 0);
	printf("%s\n", buff);
	//发送数据
	char buffSend[] = "hello, I am a client......";
	send(sockClient, buffSend, sizeof(buffSend), 0);
	
	/* 6. 关闭socket*/
	closesocket(sockClient);
	WSACleanup();
	system("pause");
}

运行结果:
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ windows下基于TCP的socket编程 入门 的相关文章

  • 2021-5-08 力扣每日一题

    1723完成所有工作的最短时间 虽迟但到 带你一文读懂状态压缩在动态规划中的应用 题目表述 给你一个整数数组 jobs 其中 jobs i 是完成第 i 项工作要花费的时间 请你将这些工作分配给 k 位工人 所有工作都应该分配给工人 且每项
  • cookie与session区别以及机制原理 http以及https

    cookie与sseion区别 1 cookie保存在客户端 session保存在服务端 2 cookie只能保管ascii字符串 session能存取任意类型数据 如 String Integer List Map等 也能保管Java B
  • How To Lock/Unlock User Accounts From The Terminal Under Ubuntu/Linux Mint

    In a previous article we have seen how to add remove user accounts from the terminal under Ubuntu Linux Mint Today we wi
  • uni-app如何导入秋云 ucharts echarts 高性能跨全端图表组件

    感性认识 想在 uni app 中使用 ucharts 官方提供了两种方法 uni modules版本 非 uni modules版本 何为 uni modules 请看官方文档 uni modules插件规范 uni app官网 dclo
  • mysql generator 配置_MyBatis Generator 超详细配置

    想快速开始 请直接拉到最后 看整体配置 MyBatis Generator 是 MyBatis 提供的一个代码生成工具 可以帮我们生成 表对应的持久化对象 po 操作数据库的接口 dao CRUD sql的xml mapper MyBati
  • LocalDate、LocalTime、LocalDateTime介绍

    一 Date与LocalDate LocalTime LocalDateTime互转 1 Date转LocalDate LocalTime LocalDateTime Date date new Date Instant instant d
  • 基于粒子群优化改进的SIFT算法实现SAR图像配准附MATLAB代码

    基于粒子群优化改进的SIFT算法实现SAR图像配准附MATLAB代码 图像配准是合成孔径雷达 SAR 图像处理中的重要任务之一 它的目标是对两幅或多幅图像进行对齐 使得它们在几何上或像素级别上达到最佳匹配 在这篇文章中 我们将介绍基于粒子群
  • 元素层叠总结

    重点 在相同的层叠环境及优先级下 inline inline block元素的层叠顺序高于block元素 详解链接 https www codercto com a 23706 html 本文转载自 https juejin im post
  • SQL根据不同状态类型动态使用不同排序方式

    SQL根据不同状态类型使用不同排序方式 1 业务场景 1 1 需求 默认按状态值为1 2 3 5 4的顺序排序 状态相同时 状态为1 则按创建时间倒序 状态为2 则按开始时间正序 1 2 示例SQL select from t table
  • 【FPGA面试题(八)】—— 实现简单的FIFO

    FPGA面试题 八 实现简单的FIFO 在FPGA的数字电路中 FIFO First In First Out 是一个非常基础且重要的模块 它可以像一个队列一样存储数据并按照先进先出的顺序进行读取 实现FIFO是FPGA工程师面试过程中经常
  • notepad: 怎么在notepad里面,将字符串替换成换行

    用Notepad 可以 利用查找和替换功能 选择正则表达式 查找目标框里输入你想要替换的字符串 替换为框里输入 r 点击替换即可 这是个 很强大的功能 利用还它可以批量替换任何字符串 比如你链接是123 123 123 123这样不换行的
  • python 实现 熵值法 确定指标权重

    步骤 设指标共p个 评价对象共g个 则构成评价值 得分 矩阵如下 xj i 表示评价对象j在指标i上的评价值 j 1 2 g i 1 2 p 指标i对应的熵值为ei的计算公式如下 根据熵值来计算指标i的权重wi 计算公式如下 程序 4个指标
  • pm2 进程管理工具,相关命令

    1 pm2需要全局安装 npm install g pm2 2 进入项目根目录 2 1 启动进程 应用 pm2 start bin www 或 pm2 start app js 2 2 重命名进程 应用 pm2 start app js n
  • minicom安装、配置和使用

    在开发过程中 我们经常需要通过串口连接Android开发板的底层系统 Linux QNX 等 minicom是一个常用串口连接终端软件 在命令行终端下通过文本界面进行操作使用 安装 sudo apt install minicom 配置 首
  • BufferedReader与FileReader及FileInputStream

    BufferedReader 是缓冲字符输入流 它继承于Reader BufferedReader 的作用是为其他字符输入流添加一些缓冲功能 BufferedReader的作用 从字符输入流中读取文本 缓冲各个字符 从而实现字符 数组和行的
  • C# Ocr离线式识别,文字提取,(附源码下载)

    源代码下载 效果图 文字内容提取后填充 JObject obj ocr GeneralBasic bt ops this richTextBox1 Text string str if obj Count gt 0 JArray jo JA
  • LeetCode - 移除元素

    一 题目描述 给定一个数组 nums 和一个值 val 你需要原地移除所有数值等于 val 的元素 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 元素的顺序可以改变 你不需要
  • GBase8a MPP Cluster 安装部署——操作系统配置建议

    编写目的 本文档面向GBase 8a产品的售后人员 用户使用人员 以及广大GBase 8a感兴趣的技术人员 以便用于指导其更好的完成GBase8a MPP Cluster 安装部署工作 对硬件配置 网络环境 操作系统及软件配置等系统实施过程
  • vue 接口数据返回之后再渲染页面_Vue怎么让数据请求成功以后再渲染页面?

    需求如下 进入页面有一个检测按钮 点击即可向后端请求数据 进入页面如果不点击检测 则显示如下 点击检测 如果返回的是正常的状态则显示 如果返回的状态是异常 则显示 目前有个BUG 就是点击检测的时候 先从变为 然后马上变为 因为逻辑里面我是
  • IJCAI2023 Summary Reject公布

    点击文末公众号卡片 找对地方 轻松参会 北京时间2023年2月25日上午6点四十左右 cmt上状态已变 分为awaiting list 和reject 此前不少人预测2月24日晚上八点或凌晨两点左右出 截至2023年2月25日 7 16 a

随机推荐

  • 调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()时遇到的一些问题

    之前在其他地方写的 一直要求手机验证 之前能跳过 麻烦点就麻烦点了 今天编辑文章的时候直接不能改了 无奈 如果手动调用 TransactionAspectSupport currentTransactionStatus setRollbac
  • mybatis获取插入数据时自动生成的主键id

    mapper文件 void insert Map
  • LaTeX

    简介 首先要介绍一下我用的Visio文件转为 eps的办法 vsd 文件 利用Visio打开 然后另存为 选择存为 pdf文件 pdf文件 利用Inkscape打开 然后另存为 选择存为 eps格式 之前一直用visio2010版 然后按照
  • 【React+TS】从零开始搭建react+typescript+router+redux+less+px2rem自适应+axios反向代理+别名@+Antd-mobile

    一 通过create react app脚手架创建项目 npx create react app testproject template typescript 在vscode中打开项目 可以看到顺利生成了react项目且组件的后缀为tsx
  • Java web项目创建笔记23 之《spring整合xxl-job》

    xxl job是一款功能强大的分布式任务调度系统 部署方法按照官网写的说明即可 https www xuxueli com xxl job 1 下载release版本代码 https github com xuxueli xxl job r
  • 先电Openstack云平台搭建【超级详细】【附带镜像】

    前言 大二上学期学习Openstack 苦于百度与CSDN上没有对应版本的教程 学的十分艰难 在此 将我的Openstack云平台搭建过程写出 留给新手学习 准备工作 VMware Workstation Pro 虚拟机 我使用版本 15
  • C++模板,模板具体化,特例化

    1 模板重载原则 函数同名 重载 时 调用优先级通常为 普通函数 gt 显式具体化 template specilazation gt 显式实例化 gt 一般模版函数 但更一般而言 有两条规则 1 gt 如果各自函数形参和调用处的实参 并非
  • Java锁的基本用法

    文章目录 Java锁的基本用法 synchronized和lock synchronized 首先在没有加锁的情况下 加锁的情况 Lock 首先在没有加锁的情况下 加锁的情况下 线程的通信 synchronized 通过wait和notif
  • Js 代替eval的方法 字符串转对象

    js中常用eval 函数将一个字符串当作一个JavaScript表达式一样去执行 但在安全漏洞上是存在隐患的 现找到eval函数的替代方法 let a custId 9860131056 custName custAdd const res
  • Apache Flink 使用DataStream API进行数据处理

    问题导读1 流处理和批处理分别入口是什么 2 对于本地和远程运行程序 都可以使用哪个函数 3 Flink数据源分为哪两类 4 Flink DataStream和DataSet source都是基于什么格式 5 Flink中kafka sou
  • 货币兑换(指针与常量)

    货币兑换 指针与常量 题目描述 设定以下汇率常量 美元汇率为6 2619 表示1美元兑换6 2619元人民币 欧元汇率为6 6744 表示1欧元兑换6 6744元人民币 日元汇率为0 0516 表示1元日元兑换0 0516元人民币 港币汇率
  • matlab 矩阵列乘系数,matlab 给某一列乘上一个系数

    矩阵M是一个 mxn 的矩阵 现在要给M矩阵的第一列都要乘上10 使其第一列扩大10倍 那肿么做呢 我第一时间用的是 M 1 M 1 10 错误的 但是这个错了 结果是不对的 这里要用点乘才行 所以正确的写法是 M 1 M 1 10 正确写
  • Qt 实现简易串口助手

    界面预览 代码如下 h文件 pragma once include
  • 重磅更新!YoloV4最新论文!解读yolov4框架

    论文地址和代码 https arxiv org abs 2004 10934v1 代码 https github com AlexeyAB darknet 本篇博文是对YOLOv4论文的翻译和框架解读 并且有PDF版本可供下载 YOLOv4
  • 如何删除EFI分区

    当我们想重装一下Ubuntu时 需要删除之前的系统以腾出空间 这时会发现之前Ubuntu系统的EFI分区用磁盘管理删除不掉 这里有两个解决方法 1 使用大白菜或者类似的U盘启动工具进入PE系统 使用自带的磁盘管理工具来进行删除 2 直接在W
  • 如何设置计算机自动连接宽带,宽带连接怎么设置,怎么设置宽带自动连接

    处于信息时代的我们 电脑 智能机早已不再是陌生的产品 宽带的连接是我们通过电脑与外部沟通 发布信息的重要渠道 如果没有宽带的连接 那么就算有电脑与无法实现上网的功能 通常会有人疑惑的是 宽带要怎么样才能够自动连接 实现上网的方便程度呢 如果
  • 帝国CMS手机APP服务器端接口API

    帝国CMS手机APP服务器端接口API 100个左右接口详细请看 https www guiboweb com appapi html 使用说明 使用示例 demo 安全验证 security 新闻模型 新闻列表与搜索 list 新闻内容
  • Nginx Windows下编译和安装

    参照官网http nginx org en docs howto build on win32 html提前下载好编译所需软件 Microsoft Visual C compiler Microsoft Visual Studio 8 an
  • 华为OD机试 -最长回文子串(C++ & Java & JS & Python)

    描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 数据范围 字符串长度1 350 1 s 350 进阶 时间复杂度 O n 空间
  • c++ windows下基于TCP的socket编程 入门

    服务器端 socket 创建1个socket bind 绑定IP地址 端口号等信息到socket上 listen 监听 设置允许最大连接数 accept 接受客户端的请求连接 send 和 recv read 和 write 收发数据 cl