1、說明
這是一個最基本的實例,一個服務端,一個客戶端;代碼在vs2019下編譯通過;服務端和客戶端放在同一臺機器上運行效果如下:
2、代碼
1)服務端
// TCPSrv.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <Winsock2.h>
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
// 加載套子節庫
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
// 創建用於監聽的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
// 綁定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// 將套接字設爲監聽模式,準備接受用戶請求
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (true)
{
// 等待客戶請求的到來
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
char strAddr[22];
PCSTR ptrAddr = inet_ntop(AF_INET, &addrClient.sin_addr, strAddr, sizeof(strAddr));
char sendBuf[300];
time_t curTime = time(NULL);
sprintf_s(sendBuf, "Welcome %s to TCP Serve at time: %d", ptrAddr, (int)curTime);
// 發送數據
send(sockConn, sendBuf, (int)strlen(sendBuf)+1,0);
// 接收數據
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
// 打印接受的數據
printf("%s\n", recvBuf);
// 關閉套接字
closesocket(sockConn);
}
return 0;
}
2)客戶端
// TCPClient.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <Winsock2.h>
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
// 加載套子節庫
WORD wVersionRequested;
WSADATA wsaData;
int err = 0;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
// 創建套接字
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
inet_pton(AF_INET, "127.0.0.1", &addrSrv.sin_addr.S_un.S_addr);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
// 向服務器發起請求
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// 接收數據打印
char recvBuf[100];
recv(sockClient, recvBuf, 100, 0);
printf("%s\n", recvBuf);
Sleep(2000);
// 發送數據
time_t curTime = time(NULL);
char sendBuf[200];
sprintf_s(sendBuf, "Thank you! Nice to meet you at time: %d !", (int)curTime);
send(sockClient, sendBuf, (int)strlen(sendBuf) + 1, 0);
// 關閉套接字
closesocket(sockClient);
WSACleanup();
return 0;
}