Linux实现socket网络通信

简介: Linux实现socket网络通信

Linux系统中实现Socket网络通信涉及到以下主要原理和步骤:

 

### 1. **Socket概念**:

- **Socket** 是应用层与传输层之间的接口,通过Socket可以在网络上进行进程间通信。在Linux中,Socket是通过文件描述符来表示的。

 

### 2. **Socket通信模型**:

- **Socket通信** 通常基于客户端-服务器模型,包括TCP和UDP两种主要的通信协议。

   - **TCP(Transmission Control Protocol)**:面向连接的可靠通信协议,通过三次握手建立连接。

   - **UDP(User Datagram Protocol)**:无连接的通信协议,速度快但不可靠。

 

### 3. **Socket编程步骤**:

- **创建Socket**:使用`socket()`系统调用创建一个Socket。

- **绑定Socket**:使用`bind()`将Socket绑定到一个地址和端口。

- **监听连接**(仅适用于TCP):使用`listen()`开始监听连接请求。

- **接受连接**(仅适用于TCP):使用`accept()`接受客户端的连接请求。

- **建立连接**:客户端使用`connect()`连接到服务器端。

- **发送和接收数据**:使用`send()`和`recv()`发送和接收数据。

- **关闭连接**:使用`close()`关闭连接。

 

### 4. **Socket编程接口**:

- 在Linux中,Socket编程主要使用C语言的Socket编程接口,包括`socket()`、`bind()`、`listen()`、`accept()`、`connect()`、`send()`、`recv()`等函数。

 

### 5. **Socket文件描述符**:

- 在Linux中,Socket被视为一种文件描述符,可以像文件一样进行读写操作。

 

### 6. **Socket编程实例**:

- 下面是一个简单的基于TCP的Socket通信的示例:

   - 服务器端:

       1. 创建Socket:`socket()`

       2. 绑定Socket:`bind()`

       3. 监听连接:`listen()`

       4. 接受连接:`accept()`

       5. 发送和接收数据:`send()`、`recv()`

   - 客户端:

       1. 创建Socket:`socket()`

       2. 建立连接:`connect()`

       3. 发送和接收数据:`send()`、`recv()`

 

通过理解以上原理和步骤,你可以开始在Linux系统上编写Socket网络通信程序,实现不同主机之间的数据传输和通信。下面是一个简单的基于TCP的客户端-服务器模型的Socket通信示例,分别展示了服务器端和客户端的实现:

 

### 1. 服务器端代码示例:

```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
#define PORT 8888
 
int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char *hello = "Hello from server";
 
    // Create socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }
 
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
 
    // Bind socket to port
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("Bind failed");
        exit(EXIT_FAILURE);
    }
 
    // Listen for connections
    if (listen(server_fd, 3) < 0) {
        perror("Listen failed");
        exit(EXIT_FAILURE);
    }
 
    // Accept incoming connection
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("Accept failed");
        exit(EXIT_FAILURE);
    }
 
    // Send message to client
    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent to client\n");
 
    return 0;
}
```

### 2. 客户端代码示例:

 

```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
#define PORT 8888
 
int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[1024] = {0};
    const char *hello = "Hello from client";
 
    // Create socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }
 
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
 
    // Connect to server
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("Connection failed");
        exit(EXIT_FAILURE);
    }
 
    // Receive message from server
    read(sock, buffer, 1024);
    printf("%s\n", buffer);
 
    return 0;
}
```

 

### 编译和运行:

1. 编译服务器端代码:`gcc server.c -o server`

2. 编译客户端代码:`gcc client.c -o client`

3. 启动服务器:`./server`

4. 启动客户端:`./client`

 

以上示例展示了一个简单的基于TCP的Socket通信的客户端-服务器模型。通过这些代码,你可以理解如何在Linux系统上使用Socket编程实现网络通信。在实际应用中,你可以根据需求扩展和修改这些代码来满足特定的通信需求。

相关文章
|
16天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
15天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
39 6
|
6天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
3天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
3天前
|
网络协议 Linux Shell
【linux网络(一)】初识网络, 理解四层网络模型
【linux网络(一)】初识网络, 理解四层网络模型
|
4天前
|
安全 Ubuntu Linux
Linux 网络操作命令Telnet
Linux 网络操作命令Telnet
17 0
Linux 网络操作命令Telnet
|
4天前
|
Ubuntu Linux
Linux(22) Linux设置网络优先级顺序
Linux(22) Linux设置网络优先级顺序
6 0
|
5天前
|
Ubuntu 网络协议 Linux
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
28 0
|
11天前
|
网络协议 Ubuntu Unix
Linux 下使用 socket 实现 TCP 客户端
Linux 下使用 socket 实现 TCP 客户端
|
15天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。