惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
IT之家
IT之家
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
阮一峰的网络日志
阮一峰的网络日志
Stack Overflow Blog
Stack Overflow Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
V
V2EX
N
Netflix TechBlog - Medium
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Blog of Author Tim Ferriss
量子位
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
月光博客
月光博客
F
Fortinet All Blogs

十二的编程笔记

26 年新年前 vibe coding 感慨 - 随便写写 社区驱动型流量的转化效能与质量特征分析 - AI - 计算机科学 ClawdBot 祛魅 2 小时安装 + 实际体验 还需再练练 - AI - 计算机科学 golang 标准库源码解析 - runtime2 GMP - Lib - GO - 计算机科学 BCTF2025-AI - BCTF2025 - CTF - 计算机科学 BCTF2025-MISC-01~08 - BCTF2025 - CTF - 计算机科学 golang 标准库源码解析 - channel - Lib - GO - 计算机科学 golang 标准库源码解析 - Context - Lib - GO - 计算机科学 golang 多版本环境控制 - GO - 计算机科学 cloudflare connect 踩坑记录 - Project - 计算机科学 BCTF2024-WEB-01~08 - BCTF2024 - CTF - 计算机科学 BCTF2024-MISC - BCTF2024 - CTF - 计算机科学 Hexo 使用 github Action 进行发布 - Project - 计算机科学 BCTF2024-REVERSE - BCTF2024 - CTF - 计算机科学 分布式事务 - 高可用 - 计算机科学 分布式 CAP 和 BASE 理论 简介 - 高可用 - 计算机科学 搭建使用 Cloudflare Worker 的 Docker 镜像 - Project - 计算机科学 GitHub Copilot 封号及退款过程 - Project - 计算机科学 记录一次 innodb 全表 update - MySQL - Database - 计算机科学
BCTF2024-IOT - BCTF2024 - CTF - 计算机科学
本文作者: Twelveeee @十二的编程笔记 · 2024-09-27 · via 十二的编程笔记
#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 8888
void 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;
}