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


    前言

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

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

    Windows下的socket编程

    1.预备工作

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

    #include
    
    #pragma comment(lib,"ws2_32.lib")
    
    • 1
    • 2
    • 3

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

    #include 
    #include 
    #include 
    
    #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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );
    
    • 1

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

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

    2. socket编程

    接下来就是正常的socket编程

    本篇博客举例echo客户端

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

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

    int WSACleanup (void);
    
    • 1

    echo客户端

    #include 
    #include 
    #include 
    
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    结束语

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

  • 相关阅读:
    数据结构 -作用及基本概念
    Python 中的 DNS 查找
    Istio实践(1)- 环境搭建及应用部署
    微服务保护Sentinel(二)-- 热点参数限流、隔离降级
    单目标应用:墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解微电网优化MATLAB
    sunxi-spi驱动的DMA配置
    2022.9.20 go语言课程作业
    实用网站合集
    数据库原理课程设计
    pdf怎么压缩的小一点?pdf文件压缩方法汇总
  • 原文地址:https://blog.csdn.net/m0_72563041/article/details/134542320