文章目录
- 前言
- 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;
}
结束语
本篇博客到此结束,感谢看到此处。
欢迎大家纠错和补充
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。