Windows Sockets (Winsock) 是 Microsoft 實作的網路程式介面,源自 Berkeley Sockets,以動態連結庫 (DLL) 形式提供。支援三種套接字類型:
socket() 建立套接字bind() 繫結本地 IP 與連接埠listen() 進入監聽狀態accept() 接受客戶端連線,取得新套接字send()/recv() 資料收發closesocket() 關閉套接字socket() 建立套接字connect() 連線至伺服器send()/recv() 資料收發closesocket() 關閉套接字
// server.cpp
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;
void main() {
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0 || LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
WSACleanup(); return;
}
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);
char revBuf[100], sendBuf[100];
while (1) {
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
cout << "我說:\n";
cin >> sendBuf;
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
recv(sockConn, revBuf, 100, 0);
cout << "對方說:\n" << revBuf << endl;
memset(revBuf, 0, 100);
closesocket(sockConn);
}
closesocket(sockSrv);
}
// client.cpp
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;
void main() {
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0 || LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
WSACleanup(); return;
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
char recvBuf[100], sendBuf[100];
while (true) {
recv(sockClient, recvBuf, 100, 0);
cout << "對方說:" << recvBuf << endl;
memset(recvBuf, 0, 100);
cout << "我說:";
cin >> sendBuf;
send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
}
closesocket(sockClient);
WSACleanup();
}
WSAStartup 初始化,結束前呼叫 WSACleanup 釋放資源。htonl/htons 處理網路位元組序轉換。