网络函数
WSAStartup
socket
bind
listen
accept
connect
send
recv
closesocket
WSACleanup
为什么要用WSAStartup初始化?
本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节
下面是官方文档
https://learn.microsoft.com/zh-cn/windows/win32/api/winsock2/nf-winsock2-wsastartup
以下代码均在本机上实现
服务器
#include<iostream>
#include<WinSock2.h>
#pragma comment (lib,"ws2_32.lib")
#pragma warning (disable:4996)
int main()
{
//初始化代码
WORD wVersion = MAKEWORD(2, 2);
WSADATA wsadata;
if (WSAStartup(wVersion, &wsadata) != 0)
{
return 0;
}
//1.socket创建套接字,返回句柄
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
//第一个参数协议簇(AE_INET ,ipv4,AF_INET6,ipv6;AF_UNIX,本机通信)
//第二个参数类型(SOCK_STREAM,TCP流,SOCK_DGRAM,UDP数据报)
//第三个参数一般设置0
if (s == INVALID_SOCKET)
{
return 0;///创建套接字失败
}
//2、bind/listen 绑定、监听端口
//端口号用于区别那个应用,比如QQ发送的数据还是浏览器发送的数据
sockaddr_in add;
int len = sizeof(sockaddr_in);
add.sin_family = AF_INET;//协议族
add.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");//表示接受任意IP地址
add.sin_port = htons(11111);//网络字节序是大尾方式,本地字节序是小尾方式
int i = bind(s, (sockaddr*)&add, len);
listen(s, 5);//瞬间来五个用户
//3、accept等待别人链接
//获取客户端IP地址以及端口
sockaddr_in caddr;
caddr.sin_family = AF_INET;
int caddrlen = sizeof(sockaddr_in);
SOCKET sclient = accept(s, (sockaddr*)&caddr, &caddrlen);
if (sclient == INVALID_SOCKET)
{
return 0;
}
int ret = send(sclient, "哎呦",strlen("哎呦"),0);
closesocket(sclient);
//反初始化操作
WSACleanup();
std::cout << "hello\n";
}
客户端
#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main()
{
//初始化代码
WORD wVersion = MAKEWORD(2, 2);
WSADATA wsadata;
if (WSAStartup(wVersion, &wsadata) != 0)
{
return 0;
}
//1.socket创建套接字,返回句柄
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
//第一个参数协议族
//第二个参数类型,什么流
//第三个,一般设置为0
if (s == INVALID_SOCKET)
{
return 0;//创建失败
}
sockaddr_in add;
int len = sizeof(sockaddr_in);
add.sin_family = AF_INET;
add.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//表示接受本机
add.sin_port = htons(11111);
//2.connect主动链接服务器
int i = connect(s, (sockaddr*)&add, len);
if (SOCKET_ERROR == i)
{
return 0;
}
//3.接受、发送数据
char sbuf[256] = { 0 };
int ret = recv(s, sbuf, 256, 0);
if (ret == 0)
{
return 0;//链接断开
}
else if (ret > 0)
{
printf(sbuf);
}
closesocket(s);
//反初始化操作
WSACleanup();
}