创建两个工程文件,Server和Client
服务器模板代码
#include <WinSock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib") //静态加入一个lib文件
#pragma warning(disable : 4996)
using namespace std;
int main() {
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0) //WSAStartup返回0表示设置初始化成功
return 0;
/*创建套接字*/
//AF_INET表示IPv4,SOCK_STREAM数据传输方式,IPPROTO_TCP传输协议;
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket == INVALID_SOCKET) {
cout << "套接字创建失败" << endl;
WSACleanup();
return 0;
}
/*绑定IP和端口*/
//配置监听地址和端口
sockaddr_in addrListen;
addrListen.sin_family = AF_INET; //指定IP格式
addrListen.sin_port = htons(8888); //绑定端口号
addrListen.sin_addr.S_un.S_addr = INADDR_ANY; //表示任何IP service.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(listenSocket, (SOCKADDR*)&addrListen, sizeof(addrListen)) == SOCKET_ERROR) {
cout << "绑定失败" << endl;
closesocket(listenSocket);
return 0;
}
/*开始监听*/
if (listen(listenSocket, 5) == SOCKET_ERROR)
{
cout << "监听出错" << endl;
closesocket(listenSocket);
return 0;
}
/*等待连接,连接后建立一个新的套接字*/
SOCKET revSocket; //对应此时所建立连接的套接字的句柄
sockaddr_in remoteAddr; //接收连接到服务器上的地址信息
int remoteAddrLen = sizeof(remoteAddr);
cout << "等待连接..." << endl;
/*等待客户端请求,服务器接收请求*/
revSocket = accept(listenSocket, (SOCKADDR*)&remoteAddr, &remoteAddrLen); //等待客户端接入,直到有客户端连接上来为止
if (revSocket == INVALID_SOCKET) {
cout << "客户端发出请求,服务器接收请求失败:" << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 0;
}
else
cout << "客服端与服务器建立连接成功:" << inet_ntoa(remoteAddr.sin_addr) << endl;
char* sendData = new char[100];
char revData[255] = "";
while (1) {
/*通过建立的连接进行通信*/
int res = recv(revSocket, revData, 255, 0);
if (res > 0)
cout << "客户端: " << revData << " 字节数:" << res << endl;
else if (res == 0)
cout << "Connection closed" << endl;
else
cout << "recv failed: " << WSAGetLastError() << endl;
cin >> sendData;
if (strcmp(sendData, "q") == 0) {
cout << "服务器停止发送数据!" << endl;
break;
}
//发送数据
send(revSocket, sendData, strlen(sendData), 0);
cout << "服务器: " << sendData << endl;
}
closesocket(listenSocket);
WSACleanup();
}
客户端模板代码
#include <WinSock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib") //静态加入一个lib文件
#pragma warning(disable : 4996)
using namespace std;
int main() {
WORD sockVerson = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVerson, &wsaData) != 0)
return 0;
//建立客户端socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET)
{
printf("套接字创建失败");
WSACleanup();
return 0;
}
//定义要连接的服务器地址
sockaddr_in addrConServer;
addrConServer.sin_family = AF_INET;
addrConServer.sin_port = htons(8888);
addrConServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(clientSocket, (SOCKADDR*)&addrConServer, sizeof(addrConServer)) == SOCKET_ERROR)
{
printf("客户端建立连接失败!\n");
closesocket(clientSocket);
WSACleanup();
return 0;
}
else
printf("客户端建立连接成功,准备发送数据!\n");
//发送数据
char sendBuf[255] = "";
while (1) {
cin >> sendBuf;
int sendRes = send(clientSocket, sendBuf, (int)strlen(sendBuf), 0);
if (sendRes == SOCKET_ERROR) {
printf("客户端send()出现错误 : %d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 0;
}
else
cout << "客户端: " << sendBuf << endl;
//接收服务端数据
/*通过建立的连接进行通信*/
int res;
char revSerData[100] = "";
res = recv(clientSocket, revSerData, sizeof(revSerData), 0);
if (res > 0) {
printf("Bytes received: %d\n", res);
printf("服务器发送的数据: %s\n", revSerData);
}
else if (res == 0)
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
}
}