基於windows的簡單伺服器端和客戶端
阿新 • • 發佈:2018-10-31
伺服器端套接字建立步驟:
1.呼叫socket函式建立套接字。
2.呼叫bind函式分配IP地址和埠號。
3.呼叫listen函式轉為可接收請求狀態。
4.呼叫該accept函式受理連線請求。
客戶端套接字建立步驟:
1.呼叫socket函式建立套接字。
2.呼叫connect函式向伺服器端傳送連線請求。
服務端:
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> void ErrorHandling(char* message); int main() { WSADATA wsaData; SOCKET hServerSock, hClientSock; SOCKADDR_IN serverAddr, clientAddr;int szClientAddr; char message[] = "hello world!"; int listenPort = 8000; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error."); hServerSock = socket(PF_INET, SOCK_STREAM, 0); if (hServerSock == INVALID_SOCKET) ErrorHandling("socket() error."); memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(listenPort); if (bind(hServerSock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) ErrorHandling("bind() error."); if (listen(hServerSock, 5) == SOCKET_ERROR) ErrorHandling("listen() error."); szClientAddr = sizeof(clientAddr); hClientSock = accept(hServerSock, (SOCKADDR*)&clientAddr, &szClientAddr); if (hClientSock == INVALID_SOCKET) ErrorHandling("accept() error."); send(hClientSock, message, sizeof(message), 0); closesocket(hClientSock); closesocket(hServerSock); WSACleanup(); return 0; } void ErrorHandling(char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
客戶端:
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> void ErrorHandling(char* message); int main() { WSADATA wsaData; SOCKET hSocket; SOCKADDR_IN serverAddr; char message[30]; int strLen; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error."); hSocket = socket(PF_INET, SOCK_STREAM, 0); if (hSocket == INVALID_SOCKET) ErrorHandling("socket() error."); memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); serverAddr.sin_port = htons(8000); if (connect(hSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) ErrorHandling("connect() error."); strLen = recv(hSocket, message, sizeof(message) - 1, 0); if (strLen == -1) ErrorHandling("read() error."); printf("Message recv: %s\n", message); closesocket(hSocket); WSACleanup(); return 0; } void ErrorHandling(char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }