### Linux Socket 通信服务端详解 #### 一、引言 在现代网络编程中,Socket 编程是一种非常重要的技术,它允许不同主机之间通过网络进行数据交换。本篇文章将详细解析一个基于 Linux 的 Socket 服务端代码示例,该服务端主要功能是接收客户端发送过来的文件。 #### 二、代码分析 ##### 1. 包含头文件 ```c++ #include<stdlib.h> #include<stdio.h> #include<errno.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/wait.h> #include<sys/socket.h> #include<iostream> #include<fcntl.h> #include<arpa/inet.h> #include<fstream> #include<sys/stat.h> ``` - **标准库**:`stdlib.h`、`stdio.h`、`errno.h`、`string.h` 提供了基本的数据类型定义、输入输出函数、错误处理等基础功能。 - **网络编程**:`sys/types.h`、`netinet/in.h`、`sys/socket.h`、`arpa/inet.h` 提供了用于网络编程的数据类型和函数定义。 - **文件操作**:`iostream`、`fstream`、`sys/stat.h` 提供了文件读写操作的支持。 - **进程控制**:`sys/wait.h` 用于处理子进程的状态信息。 ##### 2. 定义常量与函数 ```c++ #define SIZE 2048 * 20 // 文件缓冲区大小 using namespace std; void* run(void* arg); // 处理客户端连接的线程函数 ``` - **SIZE**:定义了一个常量 `SIZE`,表示接收文件时使用的缓冲区大小。 - **run 函数**:这是一个线程函数,负责处理每个客户端的连接请求。 ##### 3. 主函数 ```c++ int main(void) { int fd = 0; // socket 描述符 unsigned int port = 6000; // 监听端口 struct sockaddr_in my_addr; // 服务器地址结构 ... } ``` - **创建 Socket**: ```c++ fd = socket(AF_INET, SOCK_STREAM, 0); ``` 创建了一个 TCP 类型的 Socket,其中 `AF_INET` 表示 IPv4 地址族,`SOCK_STREAM` 表示流式套接字(TCP)。 - **绑定地址**: ```c++ res = bind(fd, (struct sockaddr*)&my_addr, sizeof(my_addr)); ``` 将创建好的 Socket 绑定到本地地址和端口上。 - **监听连接**: ```c++ res = listen(fd, 10); ``` 开始监听客户端的连接请求,参数 10 表示同时可以处理的最大未完成连接数。 - **接受连接**: ```c++ client_fd = accept(fd, (struct sockaddr*)&client_addr, &socklen); ``` 接受客户端的连接请求,返回一个新的 Socket 描述符 `client_fd` 用于后续的通信。 - **处理客户端连接**: ```c++ if (pthread_create(&tid, NULL, run, (void*)client_fd) != 0) { ... } ``` 对于每个接受到的客户端连接,都创建一个新的线程来处理客户端的请求。 ##### 4. 线程函数 ```c++ void* run(void* arg) { long client_fd = (long)arg; long length = 0; char buf[SIZE] = {'\0'}; ... } ``` - **接收数据**: ```c++ length = read(client_fd, buf, sizeof(buf)); ``` 从客户端读取数据,并存入缓冲区 `buf` 中。 - **文件处理**: 根据接收到的数据进行相应的文件操作,如创建文件、写入数据等。 #### 三、关键知识点 1. **Socket 基础**:了解 Socket 是什么,以及如何使用 Socket 进行网络通信。 2. **TCP/IP 协议**:熟悉 TCP/IP 协议栈的工作原理及其在网络通信中的应用。 3. **Socket 编程接口**:掌握 Socket API 的使用方法,包括创建 Socket、绑定地址、监听连接、接受连接等。 4. **多线程编程**:理解如何在 Linux 下使用线程库(如 pthread)来实现并发处理多个客户端连接。 5. **文件操作**:熟悉文件的打开、关闭、读写等基本操作。 #### 四、总结 通过本篇分析,我们不仅详细了解了 Linux 下 Socket 服务端的实现过程,还深入学习了相关的网络编程知识和技术要点。这对于进一步理解和掌握网络编程具有重要意义。在未来的学习和实践中,我们可以基于这些基础知识开发出更多复杂且实用的网络应用程序。
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <iostream>
#include <fcntl.h>
#include <arpa/inet.h>
#include <fstream>
#include <sys/stat.h>
//#include <io.h>
#include <unistd.h>
//#include <alloc.h>
//#include <fcntl.h>
//#include <process.h>
#define SIZE 2048*20
using namespace std;
void *run(void *arg);
int main(void)
{
int fd=0;int res=0;
unsigned int port=6000;
struct sockaddr_in my_addr;
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(port);
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
fd=socket(AF_INET,SOCK_STREAM,0); //1,create tcp socket
if(fd<0)
{
perror("socket");
exit(-1);
}
cout<<"create socket success,fd:"<<fd<<endl;
res = bind(fd,(struct sockaddr *)&my_addr,sizeof(my_addr)); //2,bind sockfd with sockaddr
if(res!=0)
{
perror("bind");
close(fd);
exit(-1);
}
cout<<"bind success."<<endl;
//3,switch active to unactive
res = listen(fd,10);
if(res!=0)
{
perror("bind");
close(fd);
exit(-1);
}
cout<<"listen success."<<endl;
//4,waiting and accept client connect request...
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助