TCP服务端

分为一下六步:

  1. 建立一个socket 套接字
  2. bind 绑定用于接受客户端连接的网络接口
  3. listen 监听网络端口
  4. accept 等待接受客户端连接
  5. send 向客户端发送一条数据
  6. 关闭套接字closesocket
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
//只有在WIN里可以
#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main() {
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
// 用Socket API 建立一个简易的TCP服务端
// 1 建立一个socket 套接字
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 2 bind 绑定用于接受客户端连接的网络接口
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);// host to net unsigned short
_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");
if (bind(_sock, (sockaddr*)&_sin, sizeof(_sin)) == SOCKET_ERROR) {
//绑定错误
cout << "绑定网络端口失败..." << endl;
}
else {
cout << "绑定网络端口成功..." << endl;
}
//3 listen 监听网络端口
if (SOCKET_ERROR == listen(_sock, 5)) {
cout << "监听网络端口失败..." << endl;
}
else {
cout << "监听网络端口成功..." << endl;
}
//4 accept 等待接受客户端连接
sockaddr_in clientAddr = {};
int nAddrLen = sizeof(sockaddr_in);
SOCKET _cSock = INVALID_SOCKET;
char msgBuf[] = "Hello ,I'm Server.";
while (true) {
_cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);
if (_cSock == INVALID_SOCKET) {
cout << "接受到无效客户端SOCKET..." << endl;
}
cout << "新客户端加入:IP =" << inet_ntoa(clientAddr.sin_addr) << endl;
//5 send 向客户端发送一条数据
send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
}
//6 关闭套接字closesocket
closesocket(_sock);
//7 清除windows socket环境
WSACleanup();
//保留界面
getchar();
return 0;
}

TCP服务端

分为四步:

  1. 建立一个socket
  2. 连接服务器 connect
  3. 接受服务器信息 recv
  4. 关闭套接字closesocket
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
//只有在WIN里可以
#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main() {
//启动Windows socket 2.x环境
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
// 用Socket API 建立一个简易的TCP服务端

// 1 建立一个socket
SOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == _sock) {
cout << "建立Socket失败..." << endl;
}
else {
cout << "建立Socket成功..." << endl;
}
// 2 连接服务器 connect
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int ret = connect(_sock, (sockaddr*)&_sin, sizeof(sockaddr_in));
if (SOCKET_ERROR == ret) {
cout << "连接Socket失败..." << endl;
}
else {
cout << "连接Socket成功..." << endl;
}
//3 接受服务器信息 recv
char recvBuf[256] = {};
int nlen = recv(_sock, recvBuf, 256, 0);
if (nlen > 0) {
cout << "接收到数据为:" << recvBuf << endl;
}
// 4 关闭套接字closesocket
closesocket(_sock);
// 5 清除windows socket环境
WSACleanup();
//保留界面
getchar();
return 0;
}

运行截图

服务端

屏幕截图 2023-12-15 181558

客户端

屏幕截图 2023-12-15 181602