#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#define MAGIC 0xdeadbeef#define FLAG_FILE "flag"#define PORT 8888void get_flag(int client_sock) {
FILE *file = fopen(FLAG_FILE, "r");
if (file == NULL) {
perror("fopen");
return;
}char flag[128];
if (fgets(flag, sizeof(flag), file) == NULL) {
perror("fgets");
fclose(file);
return;
}fclose(file);
send(client_sock, flag, strlen(flag), 0);
close(client_sock);
}void handle_client(int client_sock) {
char buffer[64];
unsigned int magic;
unsigned int size;
printf("client_sock: %d\n", client_sock);
if (recv(client_sock, &magic, sizeof(magic), 0) <= 0) {
perror("recv");
close(client_sock);
return;
}if (magic != MAGIC) {
printf("Invalid magic number\n");
close(client_sock);
return;
}if (recv(client_sock, &size, 4, 0) <= 0) {
perror("recv");
close(client_sock);
return;
}if (recv(client_sock, buffer, size, 0) <= 0) {
perror("recv");
close(client_sock);
return;
}printf("Received content: %s\n", buffer);
}* @description
* 实现一个服务器程序,使用 TCP 协议监听指定的端口,并处理来自客户端的连接请求。
* 服务器会打印出 "Server listening on port XXXX",其中 XXXX 是端口号,然后进入死循环等待客户端的连接。
* 当有新的客户端连接时,服务器会调用 handle_client 函数处理该连接。
* 如果发生错误,则输出相应的错误信息并退出程序。
*
* @param {boolean} isClientConnected* 表示是否已经连接到了客户端,默认为 false。
*
* @returns {number}* 返回一个整数,表示服务器监听的端口号。
*/
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len = sizeof(client_addr);
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock < 0) {
perror("socket");
exit(EXIT_FAILURE);
}server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
close(server_sock);
exit(EXIT_FAILURE);
}if (listen(server_sock, 5) < 0) {
perror("listen");
close(server_sock);
exit(EXIT_FAILURE);
}printf("Server listening on port %d\n", PORT);
while ((client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_len)) >= 0) {
handle_client(client_sock);
}close(server_sock);
return 0;
}#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#define MAGIC 0xdeadbeef#define FLAG_FILE "flag"#define PORT 8888void get_flag(int client_sock) {
FILE *file = fopen(FLAG_FILE, "r");
if (file == NULL) {
perror("fopen");
return;
}char flag[128];
if (fgets(flag, sizeof(flag), file) == NULL) {
perror("fgets");
fclose(file);
return;
}fclose(file);
send(client_sock, flag, strlen(flag), 0);
close(client_sock);
}void handle_client(int client_sock) {
char buffer[64];
unsigned int magic;
unsigned int size;
printf("client_sock: %d\n", client_sock);
if (recv(client_sock, &magic, sizeof(magic), 0) <= 0) {
perror("recv");
close(client_sock);
return;
}if (magic != MAGIC) {
printf("Invalid magic number\n");
close(client_sock);
return;
}if (recv(client_sock, &size, 4, 0) <= 0) {
perror("recv");
close(client_sock);
return;
}if (recv(client_sock, buffer, size, 0) <= 0) {
perror("recv");
close(client_sock);
return;
}printf("Received content: %s\n", buffer);
}* @description
* 实现一个服务器程序,使用 TCP 协议监听指定的端口,并处理来自客户端的连接请求。
* 服务器会打印出 "Server listening on port XXXX",其中 XXXX 是端口号,然后进入死循环等待客户端的连接。
* 当有新的客户端连接时,服务器会调用 handle_client 函数处理该连接。
* 如果发生错误,则输出相应的错误信息并退出程序。
*
* @param {boolean} isClientConnected* 表示是否已经连接到了客户端,默认为 false。
*
* @returns {number}* 返回一个整数,表示服务器监听的端口号。
*/
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len = sizeof(client_addr);
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock < 0) {
perror("socket");
exit(EXIT_FAILURE);
}server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
close(server_sock);
exit(EXIT_FAILURE);
}if (listen(server_sock, 5) < 0) {
perror("listen");
close(server_sock);
exit(EXIT_FAILURE);
}printf("Server listening on port %d\n", PORT);
while ((client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_len)) >= 0) {
handle_client(client_sock);
}close(server_sock);
return 0;
}