linux下socket通信,server和client简单例子(三)

本文详细解析了C语言中文件I/O操作的关键函数open和fopen的区别,以及缓冲文件系统和非缓冲文件系统的概念、特点与应用场景。通过对比这些函数的功能与使用场景,帮助开发者更好地理解和运用C语言的文件处理能力。

3. [代码]open等,fopen等说明   

 
01 某些注释部分,open,read,write被 fopen,fread,fwrite替换。
02  
03 说明一下:
04 fopenfclosefreadfwritefgetcfgetsfputcfputsfreopenfseekftell,rewind
05 缓冲文件系统
06 缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,
07 从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的
08 操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存
09 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,
10 执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
11  
12 open, close, read, write, getcgetcharputcputchar 
13 非缓冲文件系统
14 非缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、
15 字符串、格式化数据,也可以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对
16 文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,
17 由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。
18  
19 open等属于低级IO,
20 fopen等是高级IO。
21  
22 open等返回一个文件描述符(用户程序区的),
23 fopen等返回一个文件指针。
24  
25 open等无缓冲,fopen等有缓冲。
26  
27 fopen等是在open等的基础上扩充而来的,在大多数情况下,用fopen等。
28  
29 open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述符表里的索引,
30 fopen是C的库函数,返回的是一个指向文件结构的指针。
### ### TCP 服务器端示例代码 以下是一个在 Linux 环境下使用 C++ 实现的基于 TCP 协议的简单 Socket 服务器端通信代码。该代码使用 `socket`、`bind`、`listen` `accept` 函数完成基本的连接建立,并通过 `send` `recv` 进行数据收发[^2]。 ```cpp #include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <cstring> int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; const char* response = "Message received"; // 创建套接字 server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { std::cerr << "Socket creation error" << std::endl; return -1; } // 设置地址端口 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8080); // 绑定套接字到地址端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { std::cerr << "Bind failed" << std::endl; close(server_fd); return -1; } // 监听连接 if (listen(server_fd, 3) < 0) { std::cerr << "Listen failed" << std::endl; close(server_fd); return -1; } std::cout << "Server is listening on port 8080..." << std::endl; // 接受客户端连接 new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen); if (new_socket < 0) { std::cerr << "Accept failed" << std::endl; close(server_fd); return -1; } // 接收客户端消息 int valread = recv(new_socket, buffer, 1024, 0); if (valread > 0) { std::cout << "Received: " << buffer << std::endl; // 发送响应 send(new_socket, response, strlen(response), 0); std::cout << "Response sent" << std::endl; } // 关闭连接 close(new_socket); close(server_fd); return 0; } ``` ### ### TCP 客户端示例代码 以下为对应的客户端代码,使用 `socket` `connect` 建立连接,并通过 `send` 向服务器发送消息,再用 `recv` 接收响应[^3]。 ```cpp #include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <cstring> int main() { int sock = 0; struct sockaddr_in serv_addr; const char* message = "Hello from client"; char buffer[1024] = {0}; // 创建套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { std::cerr << "Socket creation error" << std::endl; return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(8080); // 将 IP 地址从字符串转换为二进制形式 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { std::cerr << "Invalid address / Address not supported" << std::endl; return -1; } // 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { std::cerr << "Connection Failed" << std::endl; return -1; } // 发送消息给服务器 send(sock, message, strlen(message), 0); std::cout << "Message sent to server" << std::endl; // 接收服务器响应 int valread = recv(sock, buffer, 1024, 0); if (valread > 0) { std::cout << "Server response: " << buffer << std::endl; } // 关闭连接 close(sock); return 0; } ``` ### ### 编译与运行 使用 g++ 编译上述代码: ```bash g++ server.cpp -o server g++ client.cpp -o client ``` 运行顺序如下: 1. 先运行服务器端程序: ```bash ./server ``` 2. 再打开另一个终端运行客户端程序: ```bash ./client ``` 客户端将向服务器发送一条文本消息,服务器接收后会打印并回传确认信息。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值