当前位置: 首页 > news >正文

如何使用Hands-On Network Programming with C快速构建第一个TCP服务器

如何使用Hands-On Network Programming with C快速构建第一个TCP服务器

【免费下载链接】Hands-On-Network-Programming-with-CBook Example Code for Hands-On Network Programming with C项目地址: https://gitcode.com/gh_mirrors/ha/Hands-On-Network-Programming-with-C

Hands-On Network Programming with C是一本专注于网络编程的实践指南,提供了丰富的C语言网络编程示例代码。本文将带你快速掌握使用该项目构建第一个TCP服务器的完整流程,从环境准备到服务器运行,让你轻松踏入网络编程的大门。

📋 准备工作:搭建开发环境

在开始构建TCP服务器之前,需要确保你的开发环境中已安装C编译器。根据项目说明,该代码支持Windows、Linux和macOS系统,并兼容gcc、clang和Microsoft Visual Studio等主流编译器。你可以通过以下命令检查gcc版本:

printf("gcc-%d.%d\n", __GNUC__, __GNUC_MINOR__);

这段代码来自test/id.c文件,可帮助你确认编译器是否正常工作。

🔍 找到TCP服务器示例代码

项目中的TCP服务器示例代码位于chap03/tcp_serve_toupper.c。该文件实现了一个将客户端发送的文本转换为大写的TCP服务器,非常适合作为入门示例。

🛠️ TCP服务器实现的核心步骤

1. 初始化网络库(Windows特有)

在Windows系统中,需要先初始化Winsock库:

WSADATA d; if (WSAStartup(MAKEWORD(2, 2), &d)) { fprintf(stderr, "Failed to initialize.\n"); return 1; }

2. 配置服务器地址

设置服务器监听的地址和端口:

struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; struct addrinfo *bind_address; getaddrinfo(0, "8080", &hints, &bind_address);

这里使用8080端口,你可以根据需要修改为其他未被占用的端口。

3. 创建并绑定套接字

创建TCP套接字并绑定到指定地址:

SOCKET socket_listen = socket(bind_address->ai_family, bind_address->ai_socktype, bind_address->ai_protocol); if (!ISVALIDSOCKET(socket_listen)) { fprintf(stderr, "socket() failed. (%d)\n", GETSOCKETERRNO()); return 1; } if (bind(socket_listen, bind_address->ai_addr, bind_address->ai_addrlen)) { fprintf(stderr, "bind() failed. (%d)\n", GETSOCKETERRNO()); return 1; } freeaddrinfo(bind_address);

4. 开始监听连接

将套接字设置为监听模式:

if (listen(socket_listen, 10) < 0) { fprintf(stderr, "listen() failed. (%d)\n", GETSOCKETERRNO()); return 1; }

参数10表示最大等待连接队列长度。

5. 接受客户端连接并处理数据

使用select函数实现多路复用,处理客户端连接和数据:

fd_set master; FD_ZERO(&master); FD_SET(socket_listen, &master); SOCKET max_socket = socket_listen; while(1) { fd_set reads = master; if (select(max_socket+1, &reads, 0, 0, 0) < 0) { fprintf(stderr, "select() failed. (%d)\n", GETSOCKETERRNO()); return 1; } // 处理新连接和数据 // ... }

当有客户端连接时,接受连接并将数据转换为大写后返回:

char read[1024]; int bytes_received = recv(i, read, 1024, 0); if (bytes_received < 1) { // 关闭连接 // ... } for (j = 0; j < bytes_received; ++j) read[j] = toupper(read[j]); send(i, read, bytes_received, 0);

🚀 编译并运行TCP服务器

使用gcc编译器编译服务器代码:

gcc chap03/tcp_serve_toupper.c -o tcp_server

编译成功后,运行服务器:

./tcp_server

服务器启动后,会显示"Waiting for connections...",此时你可以使用telnet或其他TCP客户端工具连接到服务器(地址为localhost,端口8080),发送文本测试服务器功能。

💡 常见问题解决

  • 编译错误:确保包含必要的头文件,如chap03.h。
  • 端口占用:如果8080端口已被占用,可以修改代码中的端口号。
  • 跨平台兼容性:代码中使用了条件编译(#if defined(_WIN32))来处理Windows和其他系统的差异,确保在不同平台上都能正常编译运行。

通过本文的指南,你已经成功使用Hands-On Network Programming with C项目构建了第一个TCP服务器。该项目还提供了更多网络编程示例,如UDP通信、HTTP服务器等,你可以在相应的章节(如chap04、chap07等)中找到更多学习资源。

祝你在网络编程的学习道路上取得进步!

【免费下载链接】Hands-On-Network-Programming-with-CBook Example Code for Hands-On Network Programming with C项目地址: https://gitcode.com/gh_mirrors/ha/Hands-On-Network-Programming-with-C

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1335745/

相关文章:

  • Windows 10 PowerShell原生SFTP连接CentOS 7服务器文件传输指南
  • git使用整理
  • Linux进程级网络流量监控:从原理到实战,搭建长期监控体系
  • 企业级 AI Coding 知识工程架构设计实践:从“偶尔成功”到“稳定交付”
  • 差分信号设计实战:从抗干扰原理到PCB布线黄金法则
  • 乌克兰语语音技术生态:w2v-xls-r-uk与社区资源整合指南
  • Supervisor进程守护:从原理到生产环境部署的完整指南
  • 向量数据库存储工艺文档:语义搜索比关键词快10倍
  • PatchTST-FM-r1架构解密:Transformer如何重塑时间序列预测
  • 语音识别模型参数调优秘籍:Wav2Vec2-Large-XLSR-53-Lithuanian配置文件深度解读
  • 7个nMigen实用技巧:让你的硬件设计速度提升10倍
  • Bitcoin Gold钱包安全操作指南:备份、恢复与多签功能实战
  • B站资源离线收藏指南:如何用BiliTools轻松下载4K视频与弹幕
  • 异地异地相隔千里也能同步追同一部剧?SyncTV 让远程观影像坐在同一沙发
  • 2026年国内品牌咨询机构综合****选型参考 - 品牌速递
  • 技术项目命名艺术:从“拉布布”看如何降低团队认知负荷
  • 三步实现微信聊天记录安全备份的实用指南
  • MASA模组全家桶汉化包:7大模组中文界面完整解决方案
  • 图像特征提取终极方案:swin_base_patch4_window7_224.ms_in1k的Feature Map应用指南
  • UE5 UMG嵌入Web浏览器:打通游戏UI与Web生态的完整指南
  • EAGLE PCB设计实战:从原理图到Gerber的全流程效率指南
  • 从显微成像技术解析受精过程:揭秘生命启动的细胞级可视化
  • OpenClaw本地部署:Cherry Studio与Ollama Cloud轻量化方案
  • LoadingStateView核心功能详解:从加载中到无数据,一站式缺省页解决方案
  • 飞行体验优化全攻略:从值机选座到行李收纳的实用技巧
  • STM32 SPI+DMA驱动WS2812B优化:时序校准、双缓冲与稳定性实战
  • 2026年深圳翻译公司哪家强?实力和专业多维度分析精选 - 博文翻译深圳翻译公司
  • C++ 线程实战案例解析
  • Qt QCheckBox深度解析:从状态管理到信号机制与实战应用
  • Unity微信小游戏中文显示“口口”问题:静态字体解决方案与自动扫描脚本