C语言网络验证客户端服务端代码(Windows Mingw)
以下是一个简单的网络验证客户端和服务端的代码示例:
客户端代码(client.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#define MAX_BUFFER_SIZE 1024
int main() {
WSADATA wsaData;
SOCKET clientSocket;
struct sockaddr_in serverAddr;
char serverIP[15] = '127.0.0.1';
int serverPort = 8888;
char buffer[MAX_BUFFER_SIZE];
char machineCode[100];
char username[100];
char password[100];
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf('Failed to initialize winsock.\n');
return 1;
}
// 创建客户端套接字
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
printf('Failed to create client socket.\n');
WSACleanup();
return 1;
}
// 设置服务器地址
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(serverPort);
serverAddr.sin_addr.s_addr = inet_addr(serverIP);
// 连接到服务器
if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf('Failed to connect to server.\n');
closesocket(clientSocket);
WSACleanup();
return 1;
}
// 从用户输入获取机器码、用户名和密码
printf('Enter machine code: ');
fgets(machineCode, sizeof(machineCode), stdin);
machineCode[strcspn(machineCode, '\n')] = '\0';
printf('Enter username: ');
fgets(username, sizeof(username), stdin);
username[strcspn(username, '\n')] = '\0';
printf('Enter password: ');
fgets(password, sizeof(password), stdin);
password[strcspn(password, '\n')] = '\0';
// 发送验证请求给服务器
sprintf(buffer, '%s,%s,%s', machineCode, username, password);
send(clientSocket, buffer, strlen(buffer), 0);
// 接收服务器的验证结果
memset(buffer, 0, sizeof(buffer));
recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
printf('Server response: %s\n', buffer);
// 关闭套接字和清理Winsock
closesocket(clientSocket);
WSACleanup();
return 0;
}
服务端代码(server.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#define MAX_BUFFER_SIZE 1024
#define MAX_CLIENTS 100
typedef struct {
SOCKET socket;
char machineCode[100];
char username[100];
char password[100];
} Client;
Client clients[MAX_CLIENTS];
int numClients = 0;
DWORD WINAPI ClientHandler(LPVOID clientSocket);
int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
struct sockaddr_in serverAddr, clientAddr;
int serverPort = 8888;
int clientAddrLen;
HANDLE threadHandle;
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf('Failed to initialize winsock.\n');
return 1;
}
// 创建服务器套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf('Failed to create server socket.\n');
WSACleanup();
return 1;
}
// 设置服务器地址
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(serverPort);
serverAddr.sin_addr.s_addr = INADDR_ANY;
// 绑定服务器地址
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf('Failed to bind server address.\n');
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听连接请求
if (listen(serverSocket, MAX_CLIENTS) == SOCKET_ERROR) {
printf('Failed to listen for connections.\n');
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf('Server started. Waiting for connections...\n');
while (1) {
// 接受客户端连接
clientAddrLen = sizeof(clientAddr);
clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET) {
printf('Failed to accept client connection.\n');
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf('Client connected: %s\n', inet_ntoa(clientAddr.sin_addr));
// 创建新线程处理客户端请求
threadHandle = CreateThread(NULL, 0, ClientHandler, (LPVOID)clientSocket, 0, NULL);
if (threadHandle == NULL) {
printf('Failed to create client thread.\n');
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
CloseHandle(threadHandle);
}
// 关闭服务器套接字和清理Winsock
closesocket(serverSocket);
WSACleanup();
return 0;
}
DWORD WINAPI ClientHandler(LPVOID clientSocket) {
SOCKET socket = (SOCKET)clientSocket;
char buffer[MAX_BUFFER_SIZE];
char machineCode[100];
char username[100];
char password[100];
// 接收验证请求
memset(buffer, 0, sizeof(buffer));
recv(socket, buffer, sizeof(buffer) - 1, 0);
printf('Received request: %s\n', buffer);
// 解析机器码、用户名和密码
sscanf(buffer, '%[^,],%[^,],%[^,]', machineCode, username, password);
// 进行验证(这里只是简单示例,实际应用中需根据具体需求实现验证逻辑)
int isValid = 0;
for (int i = 0; i < numClients; i++) {
if (strcmp(machineCode, clients[i].machineCode) == 0 &&
strcmp(username, clients[i].username) == 0 &&
strcmp(password, clients[i].password) == 0) {
isValid = 1;
break;
}
}
// 发送验证结果给客户端
if (isValid) {
send(socket, 'Valid', strlen('Valid'), 0);
} else {
send(socket, 'Invalid', strlen('Invalid'), 0);
}
// 关闭客户端套接字
closesocket(socket);
return 0;
}
编译和运行:
- 使用Mingw编译客户端和服务端代码:
gcc -o client client.c -lws2_32 gcc -o server server.c -lws2_32
2. 运行服务端:
server.exe
3. 运行客户端:
client.exe
客户端将提示输入机器码、用户名和密码,然后发送验证请求给服务器,并接收服务器的验证结果。
注意:这只是一个简单的示例,实际应用中需要根据需求进行改进和完善,如存储用户信息的方式、验证逻辑的复杂性等。
原文地址: https://www.cveoy.top/t/topic/pYsJ 著作权归作者所有。请勿转载和采集!