【计算机网络学习之路】Windows下的socket编程

news/2025/2/12 2:02:25/

文章目录

  • 前言
  • Windows下的socket编程
    • 1.预备工作
    • 2. socket编程
  • 结束语

前言

本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。

本篇文章仅记录Windows下socket编程和Linux的不同,并没有讲解socket编程的原理和细节
socket编程的原理和细节可以参看【计算机网络学习之路】UDP socket编程
环境是Linux

Windows下的socket编程

1.预备工作

首先,需要添加头文件和引入库

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

其次,Windows下还需要先验明版本

#include <iostream>
#include <string>
#include <WinSock2.h>#pragma warning(disable:4996)//忽略次告警
#pragma comment(lib, "ws2_32.lib")int main()
{WSADATA WSADate;//初始化网络环境if(WSAStartup(MAKEWORD(2,2),&WSADate)!=0) //使用2.2版本的Socket。{std::cerr << "init error" << std::endl;return -1;}
}

WSAStartup():主要就是进行相应的socket库绑定。
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。
以后应用程序就可以调用所请求的Socket库中的其它Socket函数了,然后绑定找到的Socket库到该应用程序中。该函数执行成功后返回0。

int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );

WSADATA:这个结构被用来存储被WSAStartup函数调用后返回的Winsock.dll执行的数据。
MAKEWORD(2,2):使用WINSOCK2版本.wsaData用来存储系统传回的关于WINSOCK的资料

  WORD MAKEWORD( BYTE bLow, //指定新变量的低字节序; BYTE bHigh //指定新变量的高字节序; ); makeword是将两个byte型合并成一个word型,一个在高8(b),一个在低8(a) 

2. socket编程

接下来就是正常的socket编程

本篇博客举例echo客户端

套接字在Windows中有自己的结构体——SOCKET
最后关闭套接字需要使用closesocket()函数
还需要调用WSACleanup()函数

WSACleanup():用来解除与Socket库的绑定
应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

int WSACleanup (void);

echo客户端

#include <iostream>
#include <string>
#include <WinSock2.h>#pragma warning(disable:4996)#pragma comment(lib, "ws2_32.lib")//硬编码服务器的端口号和IP
uint16_t serverport =
std::string serverip =int main()
{WSADATA WSADate;//初始化网络环境if (WSAStartup(MAKEWORD(2, 2), &WSADate) != 0) //使用2.2版本的Socket。{std::cerr << "init error" << std::endl;return -1;}//创建套接字SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0){std::cerr << "create socket error" << std::endl;exit(-2);}// 明确server是谁struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(serverport);server.sin_addr.s_addr = inet_addr(serverip.c_str());//收发消息while (true){// 用户输入std::string message;std::cout << "Please Enter Your Message# ";std::getline(std::cin, message);// 发送数据sendto(sock, message.c_str(), message.size(), 0, (struct sockaddr*)&server, sizeof(server));// 接受数据char buffer[2048];struct sockaddr_in temp;int len = sizeof(temp);int n = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&temp, &len);if (n > 0){buffer[n] = 0;std::cout << buffer << std::endl; //1}}closesocket(sock);WSACleanup();//清理网络环境,释放socket所占的资源return 0;
}

结束语

本篇博客到此结束,感谢看到此处。
欢迎大家纠错和补充
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述


http://www.ppmy.cn/news/1233213.html

相关文章

使用docker搭建socks5代理

我参考MuleSoft Help Center成功搭建了socks5代理服务器 文字内容如下&#xff08;怕以后访问不了&#xff09; How to set up a testing SOCKS5 proxy (dante) for Anypoint monitoring in RTF (Runtime Fabric) A demonstration to set up a SockS5 proxy with Dante and se…

科技的成就(五十三)

503、任天堂首次公开 Switch 2016 年 10 月 20 日&#xff0c;任天堂首次公开 Switch 正式名称及造型。Switch 是任天堂推出的混合型游戏机&#xff0c;可作为家用游戏机&#xff0c;也可作为便携式掌机。Switch 在开发过程中就以代号 NX 而闻名&#xff0c;成为当年的现象级产…

【iOS】知乎日报

文章目录 前言一、首页1.网络的异步请求2.避免同一网络请求执行多次3.下拉刷新与上拉加载的实现下拉刷新上拉加载 二、网页1.webView的实现2.webView的滑动加载3.网页与首页内容的同步更新 三、评论区Masonory实现行高自适应 四、收藏中心通过FMDB实现数据持久化1.创建或打开数…

priority_queue简单实现(优先级队列)(c++)

priority_queue priority_queue介绍逻辑实现框架调整算法adjust_up()adjust_down() 仿函数/比较函数仿函数特性 构造函数迭代器区间构造 完整优先级队列代码 priority_queue介绍 pri_que是一个容器适配器&#xff0c;它的底层是其他容器&#xff0c;并由这些容器再封装而来。类…

Java虚拟机(JVM)的调优技巧和实战

JVM是Java应用程序的运行环境&#xff0c;它负责管理Java应用程序的内存分配、垃圾收集等重要任务。然而&#xff0c;JVM的默认设置并不总是适合所有应用程序&#xff0c;因此需要根据应用程序的需求进行调优。通过对JVM进行调优&#xff0c;可以大大提高Java应用程序的性能和可…

LiteOS同步实验(实现生产者-消费者问题)

效果如下图&#xff1a; 给大家解释一下上述效果&#xff1a;在左侧&#xff08;顶格&#xff09;的是生产者&#xff08;Producer&#xff09;&#xff1b;在右侧&#xff08;空格&#xff09;的是消费者&#xff08;Consumer&#xff09;。生产者有1个&#xff0c;代号为“0”…

如何在 ASP.NET Core 中使用 Quartz.NET

当我们在web开发中&#xff0c;常常会遇到这么一个需求&#xff0c;在后台执行某一项具体的任务&#xff0c;具体的说就是这些任务必须在后台定时执行。 Quartz.NET 是一个开源的 JAVA 移植版&#xff0c;它有着悠久的历史并且提供了强大的 Cron 表达式&#xff0c;这篇我们就…

【python学习】基础篇-常用模块-Base64:用64个字符表示任意二进制数据的方法,常用于在URL、Cookie、网页中传输少量二进制数据

Base64是一种用64个字符表示任意二进制数据的方法&#xff0c;常用于在URL、Cookie、网页中传输少量二进制数据。 Python中的base64模块提供了一些方法用于编码和解码Base64字符串。 以下是一些常用的base64用法&#xff1a; 1.编码&#xff1a;将二进制数据转换为Base64字符…