基本流程
server服务端:
加载库,创建套接字,绑定IP地址,监听,接受连接,接收数据,发送数据,关闭套接字,卸载库
#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main() {
//加载库
WORD wVersion = MAKEWORD(2, 2);
WSADATA data;
int err = 0;
err = WSAStartup(wVersion, &data);
if (err != 0) {
cout << "WSAStartup error" << endl;
return 1;
}
if (HIBYTE(data.wVersion) != 2 || LOBYTE(data.wVersion) != 2) {
cout << "WSAStartup Version error" << endl;
return 1;
}
else {
cout << "WSAStartup sucess" << endl;
}
//创建套接字
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
cout << "socket error" << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
else {
cout << "socket sucess" << endl;
}
//绑定
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(45610);
addrServer.sin_addr.S_un.S_addr = INADDR_ANY;
err = bind(sock, (sockaddr*)&addrServer, sizeof(addrServer));
if (err == SOCKET_ERROR) {
cout << "bind error" << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
return 1;
}
else {
cout << "bind sucess" << endl;
}
//监听
err = listen(sock,10);
if (err == SOCKET_ERROR) {
cout << "listen error" << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
return 1;
}
else {
cout << "listen sucess" << endl;
}
sockaddr_in addrClient;
int addrClientSize = sizeof(addrClient);
int nRecvNum = 0;
char RecvBuf[1024] = "";
int nSendNum = 0;
char SendBuf[1024] = "";
while (true) {
//接受连接
SOCKET sockWaiter = accept(sock, (sockaddr*)&addrClient, &addrClientSize);
if (sockWaiter == INVALID_SOCKET) {
cout << "accept error" << WSAGetLastError() << endl;
break;
}
else {
cout << "accept sucess ClientIp: " <<inet_ntoa(addrClient.sin_addr)<< endl;
}
while (true) {
//接收数据
nRecvNum = recv(sockWaiter,RecvBuf,sizeof(RecvBuf),0);
if (nRecvNum > 0) {
cout << "ip:" << inet_ntoa(addrClient.sin_addr) << "say:" << RecvBuf << endl;
}
else {
cout << "recv error"<<WSAGetLastError() << endl;
break;
}
//发送数据
gets_s(SendBuf);
nSendNum = send(sockWaiter,SendBuf,sizeof(SendBuf),0);
if (nSendNum == SOCKET_ERROR) {
cout << "send error" << WSAGetLastError() << endl;
break;
}
}
//关闭套接字
closesocket(sockWaiter);
}
//关闭套接字卸载库
closesocket(sock);
WSACleanup();
return 0;
}
client客户端:
加载库,创建套接字,连接,接收数据,发送数据,关闭套接字,卸载库
#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main() {
//1.加载库---WSAStartup()
WORD wVersion = MAKEWORD(2, 2);
WSADATA data;
int err = WSAStartup(wVersion, &data);
if (0 != err) {
cout << "WSAStartup fail error" << WSAGetLastError() << endl;
}
if (2 != HIBYTE(data.wVersion) || 2 != LOBYTE(data.wVersion)) {
cout << "WSAStartup version error" << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
else {
cout << "WSAStartup success" << endl;
}
//2.创建套接字---socket()
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock) {
cout << "socket error" << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
else {
cout << "socket success" << endl;
}
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(45610);
addrServer.sin_addr.S_un.S_addr = inet_addr("172.20.10.2");
int addrServerSize = sizeof(addrServer);
int nRecvNum = 0;
char recvBuf[1024] = "";
int nSendNum = 0;
char sendBuf[1024] = "";
//连接
int nConnectNum = 0;
nConnectNum = connect(sock, (sockaddr*)&addrServer, addrServerSize);
if (nConnectNum == SOCKET_ERROR) {
cout << "connect error" << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
return 1;
}
else {
cout << "connect sucess" << endl;
}
while (true) {
//发送数据
gets_s(sendBuf);
nSendNum = send(sock, sendBuf, sizeof(sendBuf), 0);
if (nSendNum == SOCKET_ERROR) {
cout << "send error" << WSAGetLastError() << endl;
break;
}
//接收数据
nRecvNum = recv(sock, recvBuf, sizeof(recvBuf), 0);
if (nRecvNum > 0) {
cout << "Server say:" << recvBuf << endl;
}
else {
cout << "recv error" << WSAGetLastError() << endl;
break;
}
}
closesocket(sock);
WSACleanup();
return 0;
}