socket程序即为套接字,用于进行网络数据的传输。套接字有两个网络传输层协议TCP和UDP。本文使用TCP创建一个服务端和客户端程序并实现通信。
基于tcp套接字的原理如下:
服务端代码:
#include<iostream>
#include<WinSock2.h>
#include<WS2tcpip.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
//1 创建套接字
SOCKET sockSrv= socket(AF_INET, SOCK_STREAM, 0);
//2 将套接字绑定到一个本地地址和端口上
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
//3 将套接字设为监听模式,准备接受客户请求
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (true)
{
//4 等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
//5 用返回的套接字和客户端通信
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);//接收数据
cout << "服务端接收的数据为:" << recvBuf << endl;
char sendBuf[100] = "welcome to my service";
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);//发送数据
closesocket(sockConn);//关闭套接字
}
getchar();
return 0;
}
客户端代码:
#include<iostream>
#include<WinSock2.h>
#include<WS2tcpip.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
//1 创建套接字
SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0);
//2 向服务器发出连接请求
SOCKADDR_IN addrCli;
inet_pton(AF_INET, "127.0.0.1", &addrCli.sin_addr);
addrCli.sin_family = AF_INET;
addrCli.sin_port = htons(6000);
connect(sockCli, (SOCKADDR*)&addrCli, sizeof(SOCKADDR));
//3 向服务器端进行通信
char sendBuf[100] = "huanhuncao";
send(sockCli, sendBuf, strlen(sendBuf) + 1, 0);
char recvBuf[100];
recv(sockCli, recvBuf, 100, 0);
cout << "客户端接收的数据为:" << recvBuf << endl;
//4 关闭套接字
closesocket(sockCli);
WSACleanup();
getchar();
return 0;
}
首先运行服务端,接下来运行客户端,程序运行结果如下: