刚好最近在做tcp、udp通信的实验就顺便写了这篇,方便以后查阅

文章目录

  • 环境
  • 步骤
  • 流程图
  • 源代码

环境

windows 10
visual studio2013

步骤

  1. 使用WSAStartup()函数初始化Winsock DLL //Winsock DLL是Windows sockets的应用程序接口,用于支持很多Internet和网络相关应用程序
  2. 调用socket()函数创建服务器端TCP主套接字
  3. 调用bind()函数将TCP主套接字绑定到本机的一个可用的端点地址
  4. 调用listen()函数将该TCP主套接字设为被动模式,并设置等待队列长度
  5. 调用accept()函数从该TCP主套接字上接收一个新的客户端连接请求,成功建立连接后为该TCP连接创建了一个新的从套接字
  6. 基于新创建的从套接字,调用recv()函数利用该从套接字读取客户端发送过来的数据并存入缓冲区
  7. 基于新创建的从套接字,调用send()函数将缓冲区中的数据利用该从套接字发送给该远程客户端
  8. 与客户端交互完毕,调用clodesocket()函数将该从套接字关闭,释放资源
  9. 与客户机交互完毕,调用closesocket()函数将TCP主套接字关闭,最后调用WSACleanup()函数结束Winsock Socket API

流程图

写的比较简略,就是一些方法的调用顺序

源代码

//服务器
#include<WinSock2.h>
//winsock.h的2.0版本
#include<iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
//链接ws2_32.lib库
int main(int argc, char* argv[])
{//初始化Winsock DLLint ret;WORD sockVersion = MAKEWORD(2, 2);//获取欲使用的Windows Socket API版本,2.2WSADATA wsaData;ret = WSAStartup(sockVersion, &wsaData);//执行成功则返回0if ( ret!= 0){cout << "Couldn't find a useable Winsock.dll!" << endl;exit(-1);}//创建套接字int ret1;SOCKET msock;//声明主套接字描述符变量msock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建主套接字if (msock == INVALID_SOCKET)//如果出错{cout<<"Create socket failed!"<<endl;exit(-1);}//绑定IP和端口sockaddr_in servaddr;//声明端点地址结构体变量//以下三条语句用于给servaddr赋值servaddr.sin_family = AF_INET;//给协议族字段赋值servaddr.sin_addr.S_un.S_addr = INADDR_ANY;//给ip地址字段赋值servaddr.sin_port = htons(8888);//给端口号字段赋值//以下语句用于调用bind()函数将主套接字与端点地址绑定ret1 = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));if (ret1<0){cout<<"Server bind port:8888 failed!"<<endl;exit(-1);}//开始监听if (listen(msock, 9)<0) //允许连接数小于9,出错则返回-1{cout<<"Listen Failed!"<<endl;exit(-1);}//接收数据SOCKET sClient;sockaddr_in clientaddr;//端点地址结构体变量int nAddrlen = sizeof(clientaddr);char revData[255];cout<<"等待连接...\n";sClient = accept(msock, (SOCKADDR *)&clientaddr, &nAddrlen);if (sClient == INVALID_SOCKET){cout<<"Accept failed !"<<endl;exit(-1);}cout<<"接收到一个连接:"<< inet_ntoa(clientaddr.sin_addr)<<endl;//接收数据ret = recv(sClient, revData, 255, 0);if (ret > 0){revData[ret] = 0x00;cout<<"收到数据:"<<revData<<endl;}//发送数据const char * sendData = "你好,TCP客户端! \n";ret = 0;ret=send(sClient, sendData, strlen(sendData), 0);closesocket(sClient);closesocket(msock);WSACleanup();return 0;
}
//客户端#include<WinSock2.h>
#include<iostream>
#include<string>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{//初始化Winsock DLLint ret;WORD sockVersion = MAKEWORD(2, 2);WSADATA data;ret = WSAStartup(sockVersion, &data);if ( ret!= 0){cout << "Couldn't find a usable Winsock.dll!" << endl;exit(-1);}//调用socket()函数创建客户端TCP套接字SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sclient == INVALID_SOCKET){printf("Create socket failed!");return 0;}//找到服务器端套接字端点地址sockaddr_in serAddr;//以下三条语句用于给端点地址结构体servaddr赋值serAddr.sin_family = AF_INET;serAddr.sin_port = htons(8888);serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本机回送地址,不进行网络传输//发起tcp连接请求if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){//连接失败 cout<<"Connect Failed !"<<endl;closesocket(sclient);exit(-1);}//发送数据cout << "请输入想要发送的数据:" << endl;string data1 ;cin >> data1;const char * sendData;sendData = data1.c_str();//string转const char*send(sclient, sendData, strlen(sendData), 0);//发送数据char recData[255];ret = recv(sclient, recData, 255, 0);if (ret > 0){recData[ret] = 0x00;printf(recData);}closesocket(sclient);WSACleanup();return 0;
}

运行截图:
服务器:

客户端:

先运行服务器再运行客户端
windows下的udp通信和linux下的tcp、udp通信都和这个差不多,只是需要注意一下头文件、函数名称什么的

Windows下的TCP通信相关推荐

  1. Windows下 c++ TCP通信

    1.首先需要下载ws2_32.lib静态库 2.在VS上部署: 属性页->链接器->输入->附加依赖库:添加ws2_32.lib 代码头部添加: #pragma comment (l ...

  2. Windows下的socket通信,实时发送消息

    在客户端与服务端进行信息交互的时候,我们经常想让他们进行实时对话,下面我将给出客户端与服务器实时通信的代码,采用C语言与C++混合编写,基于tcp协议,键盘输入想发送的数据,接收到数据之后,对数据进行 ...

  3. ROS系统下完成TCP通信 C语言编程

    ROS系统下完成TCP通信,服务端和客户端C语言编程 服务端(Server): #include <std_msgs/Bool.h> #include "ros/ros.h&qu ...

  4. java tcp client断开重连_ESP8266_12 ESP8266客户端模式下的TCP通信

    上一节说了UDP,这一节就聊聊TCP,毕竟它俩经常同时出现.优缺点上一节也提了一下:安全性好,速度慢. 除了这两点,还有就是: TCP通信之前是需要建立连接的,如同打电话之前先拨号一样,而UDP无连接 ...

  5. Windows下测试tcp/udp端口是否打开

    简介 很多时候我们需要检测某台服务器的端口是否开放,当然网上也有很多在线检测的小工具,其实在本地电脑也是可以检测的.本文就介绍一下两种小办法. 一.tcping检测TCP端口是否开放 1.下载tcpi ...

  6. Windows下查看tcp端口占用、会话命令

    1.查看所有端口占用情况:netstat 2.查看某一端口占用情况:netstat -ano | findstr "8080" 3.查看有效会话(TIME_WAIT)数量:nets ...

  7. 【学习笔记】在windows下进行基于TCP的本地客户端和服务端socket通信

    文章目录 socket介绍 java中使用socket 基于tcp的socket通信 使用ServerSocket类创建一个web服务器:(java) windows下的基于tcp的socket编程( ...

  8. 【技术备忘录】广和通ADP-L610-Arduino模块实现基于内网穿透的TCP通信

    前言 ​ 在使用ADP-L610开发板进行开发过程中,如果需要使用TCP通信,那么往往需要本地机器具有公网IP或者是准备一台具有公网IP的云服务器(或者VPS),这往往是需要成本的.现在公网IPv4地 ...

  9. [转][linux]简单的linux下的tcp/udp

    转自:https://blog.csdn.net/cabing2005/article/details/53068880 详细函数以及参数解释请看原链接. windows下的tcp/udp参考:htt ...

最新文章

  1. pyside2 安装_PySide2安装踩坑指南
  2. Spring Boot 2 快速教程:WebFlux Restful CRUD 实践(三)
  3. 笔记-项目范围管理-项目范围说明书
  4. python编程题3
  5. C# 中的委托和事件[转]
  6. java 混码_kotlin java 混合代码 maven 打包实现
  7. python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息
  8. jakarta ee_关于Jakarta EE软件包名称更改的思考
  9. 干货收藏!639页《深度学习:Deep Learning》图文并茂课程PPT
  10. ubuntu 以太网已连接但是无法联网_5G物联网掀起工业自动化新高潮 连接器需求巨大...
  11. Energetically Consistent Invertible Elasticity
  12. 基于 Apache Mahout 构建社会化推荐引擎
  13. Flutter之ParentDataWidget和RenderObjectWidget详解
  14. java.io.IOException: Filesystem closed
  15. JavaScript中unescape函数
  16. R语言:Error in file(out, “wt“) : cannot open the connection
  17. Office2016软件安装教程
  18. pyspark运行ALS推荐算法
  19. 《爱的五种能力》阅读笔记(完整版)
  20. 4. 利用MySQL Shell安装部署MGR集群 | 深入浅出MGR

热门文章

  1. Java框架之SpringMVC学习笔记
  2. Project Anarchy 2013.2 已发布,包含重大更新!
  3. 微信支付开发若干问题总结,API搞死人(谢谢ζั͡ޓއއއ๓http://www.thinkphp.cn/code/1620.html)血淋淋的教训,第二次栽这里了...
  4. 动漫高清化画质增强(适合普通用户)
  5. pythonurllib2方法_解决python3.6想使用urllib2包的方法
  6. Word批量删除图片
  7. mysql utf-8转utf8mb4_mysql中utf8 ,utf8mb4区别转化方法
  8. 微信小程序自定义navbar
  9. 360百科成自媒体平台 已成功吸引账号入驻 [冷笑话精选]
  10. C++中将字符串转换为数字