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

相关文章
|
10天前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
42 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
2月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
126 18
|
2月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
120 5
|
3月前
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
188 5
|
3月前
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
69 0
|
5月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
146 18
|
5月前
|
Linux 数据安全/隐私保护
使用Linux命令行接入无线网络Wi-Fi的示例。
现在,你已经使用命令行成功地连接到 Wi-Fi 网络了。这两个示例涵盖了用 `nmcli` 和 `wpa_supplicant` 连接无线网络的常见场景,让你能够不依赖图形化界面来完成这个任务。在日常使用中熟练掌握这些基本操作能增强你对 Linux 系统的理解,帮助你更有效地处理各种问题。
235 12
|
5月前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
156 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
7月前
|
Ubuntu Linux
Linux系统管理:服务器时间与网络时间同步技巧。
以上就是在Linux服务器上设置时间同步的方式。然而,要正确运用这些知识,需要理解其背后的工作原理:服务器根据网络中的其他机器的时间进行校对,逐步地精确自己的系统时间,就像一只犹豫不决的啮齿动物,通过观察其他啮齿动物的行为,逐渐确定自己的行为逻辑,既简单,又有趣。最后希望这个过程既能给你带来乐趣,也能提高你作为系统管理员的专业素养。
1090 20
|
7月前
|
JSON 运维 Ubuntu
Linux下如何使用Curl进行网络请求
希望这篇文章能帮助您在Linux下更好地使用Curl进行网络请求。如有疑问,请随时提问!
345 10