【计算机网络】 基于TCP的简单通讯(服务端)

news2024/11/16 23:45:29

文章目录

    • 流程伪代码
    • 代码实现
      • 加载库
      • 创建套接字
      • 绑定ip地址和端口号
      • 监听
      • 接受连接
      • 收发数据
      • 关闭套接字、卸载库

在这里插入图片描述

流程伪代码

//1、加载库——WSAStartup()

//2、创建套接字——socket()

//3、绑定ip和端口号——bind()

//4、监听——listen()

while(true){
    //5、接受连接——accept()
    
    while(true){
        //6、接收数据——recv()
        
        //7、发送数据——send()
    }
}

//8、关闭套接字、卸载库——closesocket()、WSACleanup()

代码实现

加载库

加载库和UDP一样,不用过多解释

	int err = 0;
	WORD version = MAKEWORD(2, 2);
	WSADATA wsaData;
	err = WSAStartup(version, &wsaData);
	if (0 != err) {
		cout << "WSAStartup error" << WSAGetLastError() << endl;
		return 1;
	}
	if (2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion)) {
		cout << "WSAStartup version error" << endl;
		WSACleanup();
		return 1;
	}
	else {
		cout << "WSAStart success" << endl;
	}

创建套接字

思路和UDP也相同,只不过参数有所变化

	SOCKET sock = socket(AF_INET,SOCK_STREAM , IPPROTO_TCP);
	if (INVALID_SOCKET == sock) {
		cout << "socket error" << WSAGetLastError() << endl;
		WSACleanup();
		return 1;
	}
	else {
		cout << "socket success" << endl;
	}

绑定ip地址和端口号

绑定也和UDP中的一样

	sockaddr_in addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(456789);
	addrServer.sin_addr.S_un.S_addr = INADDR_ANY;
	err = bind(sock, (sockaddr*)&addrServer, sizeof(addrServer));
	if (SOCKET_ERROR == err) {
		cout << "bind error:" << WSAGetLastError() << endl;
		closesocket(sock);
		WSACleanup();
		return 1;
	}
	else {
		cout << "bind success" << endl;
	}

监听

监听我们用listen()函数进行,他有两个参数,第一个为socket,意为派哪个socket去进行监听,第二个参数为int值,它是能够等待被连接的队列的最大长度,返回值如果是0就没有问题,为SOCKET_ERROR就报错

	err = listen(sock, 10);
	if (SOCKET_ERROR == err) {
		cout << "listen error:" << WSAGetLastError() << endl;
		closesocket(sock);
		WSACleanup();
		return 1;
	}
	else {
		cout << "listen success" << endl;
	}

接受连接

接受连接我们使用accept()函数,它的返回值为SOCKET,当创建连接成功时会返回一个新的socket,因为之前我们创建的socket去进行监听了,所以我们需要再创建一个socket来接这个返回值。它的第一个参数为socket,就是我们用来进行监听的那个socket,进行监听的这个socket就相当于酒店迎宾的,而返回的socket就相当于是服务员。第二个参数为sockaddr*类型的输出参数,它用来装对端的地址信息,第三个参数就是这个输出参数的长度。

	sockaddr_in addrClient;
	int addrClientSize = sizeof(addrClient);
    //接受连接
    SOCKET sockTalk = accept(sock, (sockaddr*)&addrClient, &addrClientSize);
    if (INVALID_SOCKET != sockTalk) {
        //打印客户端的IP地址
        cout << "Client ip:" << inet_ntoa(addrClient.sin_addr) << endl;
    }
    else {
        cout << "accept error:" << WSAGetLastError() << endl;
        break;
    }

收发数据

当连接成功之后就可以进行收发数据了

接收数据我们使用recv()函数,这个函数相比recvfrom()少了两个参数,它不需要记录对端的地址信息了,因为已经跟对端连接成功了,已经知道对端的地址信息了,连接成功返回的socket就像是连接在两端的一条绳。只能给连接成功的两端使用,如果别人想使用,那么需要跟另外一端重新建立连接,也就是说想跟谁通信就用跟谁连接产生的socket

	int nRecvNum = 0;
	char recvBuf[1024] = "";
    nRecvNum = recv(sockTalk, recvBuf, sizeof(recvBuf), 0);
    if (nRecvNum > 0) {
        cout << "Client say:" << recvBuf << endl;
    }
    else {
        cout << "recv error:" << WSAGetLastError() << endl;
        break;
    }

发送数据我们使用send()函数,原理和recv()函数相同

	int nSendNum = 0;
	char sendBuf[1024] = "";
    gets_s(sendBuf);
    nSendNum = send(sockTalk, sendBuf, sizeof(sendBuf), 0);
    if (SOCKET_ERROR == nSendNum) {
        cout << "send error:" << WSAGetLastError() << endl;
        break;
    }

关闭套接字、卸载库

当我们结束与这个客户端聊天时,我们应该关闭与这个客户端连接时产生的套接字(外层循环里面进行)

	closesocket(sockTalk);

最终关闭监听用的sock然后卸载库

	closesocket(sock);
	WSACleanup();

这样我们的服务端就写完了

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

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

相关文章

kkplayer用户手册

本软件不使用任何敏感权限都可拒绝。所有资源均来自互联网&#xff0c;本软件仅供学习参考使用。 有任何问题可先尝试重装最新版 1.青少年模式 2.搜索方法 3.单个添加视频源 4.批量添加视频源 5.无法播放,无法全屏 6.DLNA投屏 7.隐私权限问题 8.数据备份和分享 9.关于广告 1. …

线程池解析

文章目录 1、平时使用哪些线程池&#xff0c;线程池默认的参数有哪些2、线程池的7个参数3、线程池状态①、线程池各个状态切换图&#xff1a; 4、线程池的使用5、线程池的好处6、线程池的整个流程7、Java的线程池说说①、线程池概念②、线程池的创建③、任务执行④、四种拒绝策…

005:根据股票代码和起始日期获取K线数据

我们改进《001》中的部分&#xff0c;因为他他没法在可视化界面输入信息&#xff0c;这样太麻烦。我们设法在可视化界面输入股票代码和起始日期&#xff0c;这样可以灵活得多。这部分&#xff0c;我们仍旧只获取日K线的数据。 import tkinter as tk from tkinter import messa…

Final Draft 12.0.9(简单好用的剧本写作工具)

Final Draft 12是一款专为编剧打造的强大写作工具&#xff0c;它将您的创意转化为精彩剧本的过程变得简单而高效。以下是推荐Final Draft 12的一些理由&#xff1a; 界面设计&#xff1a;Final Draft 12采用了简洁直观的界面设计&#xff0c;使得用户可以专注于创作&#xff0…

C语言的学习快速入门

可以按照以下步骤进行&#xff1a; 了解基本概念和语法&#xff1a;C语言是一种结构化的编程语言&#xff0c;了解基本的语法规则对于入门非常重要。可以学习关键字、变量、数据类型、运算符、控制结构等基本概念。学习编程环境&#xff1a;选择合适的编程环境&#xff0c;例如…

在linux下预览markdown的方法,转换成html和pdf

背景 markdown是一种便于编写和版本控制的格式&#xff0c;但却不便于预览——特别是包含表格等复杂内容时&#xff0c;单纯的语法高亮是远远不够的——这样就不能边预览边调整内容&#xff0c;需要找到一种预览方法。 思路 linux下有个工具&#xff0c;叫pandoc&#xff0c…

关闭手机广告的步骤

关闭手机广告的步骤 小米 1.设置→小米账号→声明与条款→系统广告→系统工具广告→关闭 2.设置→应用设置→应用管理→右上角三个点→设置→关闭“应用升级提醒”&“资源推荐” 3.桌面左滑打开负一屏→划到底部→设置→服务管理→选择关闭项目 4.桌面→打开任意文件夹…

数据库索引的分类

说到BTree首先要说一下B-Tree B-Tree(Balance Tree 多路平衡查找树)是一种平衡的多路搜索树数据结构&#xff0c;用于实现高效的查找、插入和删除操作。B树的特点是每个节点可以存储多个关键字&#xff0c;并且节点的孩子数目与关键字数目相同。通过控制节点的关键字数目和孩子…

最新影视视频微信小程序源码-带支付和采集功能/微信小程序影视源码PHP(更新)

源码简介&#xff1a; 这个影视视频微信小程序源码&#xff0c;新更新的&#xff0c;它还带支付和采集功能&#xff0c;作为微信小程序影视源码&#xff0c;它可以为用户 提供丰富的影视资源&#xff0c;包括电影、电视剧、综艺节目等。 这个小程序影视源码&#xff0c;还带有…

ue5读取自定义文件夹中内容

一、复制文件夹到Content内 二、读取文件内容&#xff0c;直接使用相对路径就可以了/Content&#xff0c;Resource Bundle存储文件夹名的变量。Load Text为自定义的读取json文件的方法&#xff0c;我之前的文章讲了怎么操作。 ue5读取外部文件_艺菲的博客-CSDN博客 三、根据js…

优优嗨聚集团:多地迎来旅游旺季,外卖市场有何变化

随着气温的升高&#xff0c;多地迎来了旅游旺季。据相关数据显示&#xff0c;今年暑期旅游市场异常火爆&#xff0c;全国旅游业收入同比增长了20%。在这样的大背景下&#xff0c;外卖市场也悄然发生了变化。 首先&#xff0c;让我们来看一下旅游市场的现状。据统计&#xff0c;…

Nginx 默认location index设置网站的默认首页

/斜杠代表location定位的路径&#xff0c;路径当中最重要的字段就是root。 root默认值就是html&#xff0c;这个就是nginx安装路径下面的html文件夹作为root的路径。默认不配置就是root下面的内容&#xff0c;index指定了主页的内容。 [rootjenkins html]# echo test > te…

Zotero同步论文、笔记

之前用 Mendeley[1]看论文&#xff0c;看中几个功能&#xff1a; tags&#xff0c;多标签分类&#xff0c;类似微信分组&#xff0c;用来快速筛&#xff08;已添加的&#xff09;某一类文献&#xff1b;同步&#xff0c;包括 pdf 和笔记&#xff08;高亮、便签、tags&#xff…

VRTE CreateLogger API log输出的问题

我查了手册&#xff0c;因为调用CreateLogger API时没有指定LogLevel&#xff0c;LogLevel设置为默认值kWarning。 如果将LogLevel声明为kInfo&#xff0c;则问题已解决&#xff1a; 顺便说一句&#xff0c;这是一种特殊的情况&#xff0c;因为当AraLOG_Remote在启动时&#xf…

国密cfca的好处

什么是国密SSL证书&#xff1f; 国密SSL证书采用我国自主研发的SM2公钥算法体系&#xff0c;支持SM2,SM3,SM4等国产密码算法及国密SSL安全协议。国密SSL证书可以满足政府机构、事业单位、大型国企、金融银行等行业客户的国产化改造和国密算法合规需求。 国密SSL证书的好处有哪…

微服务架构转型

微服务转型-架构规划 业务架构和数据架构 应用架构的规划和建设 微服务转型-服务拆分 微服务转型-和敏捷方法论集成 微服务转型-实施前技术储备 微服务转型-实施步骤

C++ 2019-2022 CSP_J 复赛试题横向维度分析(下)

本文继续讲解第4题&#xff0c;第4题是压轴题&#xff0c;难度肯定是有的。也决定了是否能够拿到一等奖的关键题&#xff0c;也是区别能力高低的筛选题。 1.2022 1.1 题目 上升点列point 1.2 题目描述 在一个二维平面内&#xff0c;给定n个整数点(xi,yi)&#xff0c;此外你…

u盘初始化后怎么恢复文件?这几步操作帮你找回

随着科技的进步和便携设备的普及&#xff0c;U盘已经成为我们日常工作和生活中不可缺少的存储介质。然而&#xff0c;在使用U盘的过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是意外的初始化导致文件丢失。本文将为大家介绍如何在U盘初始化后恢复文件的方法…

苹果mac电脑显示内存不足如何解决?

忍痛删应用、删文档、删照片视频等等一系列操作都是众多Mac用户清理内存空间的方法之一&#xff0c;悲催的是一顿“猛如虎的操作”下&#xff0c;释放出来的内存空间却少的可怜&#xff0c;原因很简单&#xff0c;这样释放内存空间是无效的。如何合理有效的清理内存空间&#x…

【yolov1】详解yolov1理论 代码

目标检测要解决的3大问题&#xff1a; 1、有没有&#xff1f; 图片中是否有要检测的物体&#xff1f;&#xff08;检测物体&#xff0c;判定前景背景&#xff09; 2、是什么&#xff1f; 这些物体分别是什么&#xff1f;&#xff08;检测到的物体是什么&#xff09; 3、在…