三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

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

如何使用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),仅供参考

← 返回列表