【计算机网络】Windows下的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;
}

结束语

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows下的socket网络编程是一种用于实现网络通信的编程技术。它可以在Windows操作系统上创建和管理网络连接,使不同计算机之间可以进行数据传输和通信。在这个领域中,TCP/IP协议是最常用的协议之一,它提供了可靠的数据传输和连接管理。在Windows下进行socket网络编程,可以使用Winsock库来实现。\[1\] 在客户端代码中,首先需要初始化Winsock库,然后创建一个套接字对象,指定地址和端口号,然后通过connect函数连接到服务器。之后可以通过recv函数接收服务器发送的数据,通过send函数发送数据给服务器,最后关闭套接字并清理Winsock库。\[2\] 在服务端代码中,同样需要初始化Winsock库,然后创建一个套接字对象,指定地址和端口号,并通过bind函数将套接字绑定到指定的地址和端口。之后可以通过recvfrom函数接收客户端发送的数据,通过sendto函数发送数据给客户端。服务端可以通过循环不断接收和发送数据,实现与客户端的通信。最后关闭套接字并清理Winsock库。\[3\] 通过使用socket网络编程,可以实现在Windows下进行网络通信,包括TCP和UDP协议的通信。这对于开发网络应用程序和实现网络功能非常有用。 #### 引用[.reference_title] - *1* *2* *3* [Windows下的socket编程](https://blog.csdn.net/qq_44722098/article/details/126001350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值