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编程实现网络通信。在实际应用中,你可以根据需求扩展和修改这些代码来满足特定的通信需求。

相关文章
|
2天前
|
运维 网络协议 Linux
Docker网络_docker 网络,来看看这份超全面的《Linux运维面试题及解析》
Docker网络_docker 网络,来看看这份超全面的《Linux运维面试题及解析》
|
4天前
|
Java 开发者 Spring
Java一分钟之-Java网络编程基础:Socket通信
【5月更文挑战第13天】本文介绍了Java Socket编程基础知识,包括使用`ServerSocket`和`Socket`类建立连接,通过`OutputStream`和`InputStream`进行数据传输。常见问题涉及忘记关闭Socket导致的资源泄漏、网络异常处理及并发同步。理解Socket通信原理并掌握异常处理、资源管理和并发控制,能帮助开发者构建更稳定的网络应用。
28 1
|
4天前
|
网络协议 Java 网络安全
【计算机网络】—— Socket通信编程与传输协议分析
【计算机网络】—— Socket通信编程与传输协议分析
12 0
|
4天前
|
网络协议 Linux 网络架构
|
4天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
28 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
4天前
|
域名解析 网络协议 Linux
linux网络配置详解
linux网络配置详解
24 0
|
4天前
|
网络协议 Java Linux
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
14 0
|
4天前
|
存储 网络协议 算法
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
16 0
|
4天前
|
网络协议 算法 Linux
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
16 0
http://www.vxiaotou.com