服务端
加载库 ws2_32.lib、WSAStartup()
//1.加载库
int err = 0;
WORD version = MAKEWORD(2,2);
WSADATA wsaData;
err = WSAStartup(version,&wsaData);
//判断返回值
if (err!=0) {
cout << "WSAStartup error" << endl;
return 1;
}
//判断加载的版本是否是2.2版本 HIBYTE高字节 LOBYTE低字节
if (2!=HIBYTE(wsaData.wVersion)||2!=LOBYTE(wsaData.wVersion)) {
cout << "WSAStartup Version error" << endl;
WSACleanup();//卸载库
return 1;
}
else {
cout << "WSAStartup success" << endl;
}
创建套接字 socket()
//2.创建套接字 AF_INET ipv4
SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
cout << "socket error : "<<WSAGetLastError() << endl;
WSACleanup();//卸载库
return 1;
}
else {
cout << "socket success" << endl;
}
绑定IP bind()
int bind( [in] SOCKET s, const sockaddr *addr, [in] int namelen );
//3.绑定ip,是在操作系统里面注册端口和ip地址,也就是说当操作系统收到发给某个端口号和ip地址的数据,就是咱们程序要接受的
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(456789); //转换成网络字节序也就是大端存储 , 本机是小端存储
addr.sin_addr.S_un.S_addr = INADDR_ANY; //绑定所有网卡
err=bind(sock, (sockaddr*)&addr, sizeof(addr));
if (err == SOCKET_ERROR) {
cout << "bind error : " << WSAGetLastError() << endl;
closesocket(sock);//关闭套接字
WSACleanup();//卸载库
return 1;
}
else {
cout << "bind success" << endl;
}
接收消息、回复消息 recvfrom()、sendto()
recvfrom
int recvfrom(
[in] SOCKET s,
[out] char *buf,
[in] int len,
[in] int flags,
[out] sockaddr *from, //输出参数
[in, out, optional] int *fromlen
);
sendto
int sendto(
[in] SOCKET s,
[in] const char *buf,
[in] int len, [in] int flags,
[in] const sockaddr *to, //输入参数
[in] int tolen
);
int nRecvNum = 0;
int nSendNum = 0;
char recvBuf[1024] = "";
sockaddr_in addrClient;
int addrClientSize = sizeof(addrClient);
while (true) {
//4.接收数据
nRecvNum = recvfrom(sock, recvBuf,sizeof(recvBuf),0, (sockaddr*)&addrClient, &addrClientSize);
if (nRecvNum>0) {
//接收数据成功,打印一下接收数据内容和发送端的ip地址
//"192.168.3.145"十进制四等分字符串类型ip地址
//ulong类型的ip地址sockaddr_in.sin_addr.S_un.S_addr
//从ulong类型转化成字符串类型ip地址: inet_ntoa(addrClient.sin_addr);
//从字符串类型转化成ulong类型ip地址: inet_addr();
cout <<""<< inet_ntoa(addrClient.sin_addr) << " say:" << recvBuf << endl;
}
else {
//接收失败,打印失败日志,结束循环
cout<<"recvfrom error:"<< WSAGetLastError() << endl;
break;
}
//5.发送数据
char msg[] = "genshin启动";
sendto(sock,msg,sizeof(msg),0, (sockaddr*)&addrClient, addrClientSize);
if (SOCKET_ERROR == nSendNum) {
//发送失败,打印失败日志,结束循环
cout<<"sendto error:"<< WSAGetLastError() << endl;
break;
}
}
关闭套接字卸载库 closesocket()、WSACleanup()
//6.关闭套接字,卸载库
//关闭套接字
closesocket(sock);
//卸载库
WSACleanup();
客户端
加载库 ws2_32.lib、WSAStartup()
//1.加载库
int err = 0;
WORD version = MAKEWORD(2,2);
WSADATA wsaData;
err = WSAStartup(version,&wsaData);
//判断返回值
if (err!=0) {
cout << "WSAStartup error" << endl;
return 1;
}
//判断加载的版本是否是2.2版本 HIBYTE高字节 LOBYTE低字节
if (2!=HIBYTE(wsaData.wVersion)||2!=LOBYTE(wsaData.wVersion)) {
cout << "WSAStartup Version error" << endl;
WSACleanup();//卸载库
return 1;
}
else {
cout << "WSAStartup success" << endl;
}
创建套接字 socket()
//2.创建套接字 AF_INET ipv4
SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
cout << "socket error : "<<WSAGetLastError() << endl;
WSACleanup();//卸载库
return 1;
}
else {
cout << "socket success" << endl;
}
发送消息、接收消息 sendto()、recvfrom()
int nRecvNum = 0;
int nSendNum = 0;
char recvBuf[1024] = "";
sockaddr_in addrClient;
addrClient.sin_family = AF_INET;
addrClient.sin_port = htons(456789);
addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.0.102");
int addrClientSize = sizeof(addrClient);
while (true) {
//3.发送数据(已知对端ip)
char msg[] = "我超op";
sendto(sock, msg, sizeof(msg), 0, (sockaddr*)&addrClient, addrClientSize);
if (SOCKET_ERROR == nSendNum) {
//发送失败,打印失败日志,结束循环
cout << "sendto error:" << WSAGetLastError() << endl;
break;
}
//4.接收数据
nRecvNum = recvfrom(sock, recvBuf, sizeof(recvBuf), 0, NULL, NULL);
if (nRecvNum > 0) {
//接收数据成功,打印一下接收数据内容和发送端的ip地址
cout << " server say:" << recvBuf << endl;
}
else {
//接收失败,打印失败日志,结束循环
cout << "recvfrom error:" << WSAGetLastError() << endl;
break;
}
}
关闭套接字卸载库 closesocket()、WSACleanup()
//5.关闭套接字,卸载库
//关闭套接字
closesocket(sock);
//卸载库
WSACleanup();