好的!下面是一篇关于【Linux】socket网络编程基础的详细教程,涵盖概念、常用API、简单示例和关键点,适合初学者入门。

目录

  1. 什么是Socket?
  2. Socket类型和协议
  3. Linux下的Socket API介绍
  4. Socket编程流程
  5. 简单TCP客户端和服务器示例
  6. 常见问题和调试技巧

1. 什么是Socket?

Socket(套接字)是网络编程的基础,是进程间通信(IPC)的一种抽象。它提供了一组API,用于不同主机之间通过网络进行数据传输。

在Linux系统中,Socket是一种特殊文件,通过系统调用实现网络通信,类似文件的读写。


2. Socket类型和协议

  • 流式套接字(SOCK_STREAM)
    基于TCP协议,提供可靠的、面向连接的字节流服务。适合需要稳定传输的应用,如HTTP、FTP。
  • 数据报套接字(SOCK_DGRAM)
    基于UDP协议,无连接、不保证可靠性,适合实时性高、容错性强的应用,如视频直播、在线游戏。
  • 原始套接字(SOCK_RAW)
    允许访问底层协议,通常用于实现自定义协议或网络抓包工具。

3. Linux下的Socket API介绍

Linux通过POSIX标准提供丰富的Socket接口,常用函数包括:

函数名作用
socket()创建一个新的套接字
bind()绑定IP地址和端口到套接字
listen()监听端口,等待客户端连接
accept()接受客户端连接,返回新的套接字
connect()客户端主动发起连接
send()/sendto()发送数据
recv()/recvfrom()接收数据
close()关闭套接字

4. Socket编程流程

TCP服务器端流程

  1. 调用 socket() 创建套接字
  2. 调用 bind() 绑定IP地址和端口
  3. 调用 listen() 监听端口
  4. 循环调用 accept() 接受客户端连接
  5. 通过新套接字与客户端通信,使用 send() 和 recv()
  6. 关闭套接字

TCP客户端流程

  1. 调用 socket() 创建套接字
  2. 调用 connect() 连接服务器
  3. 通过套接字与服务器通信,使用 send() 和 recv()
  4. 关闭套接字

5. 简单TCP服务器示例(C语言)

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int server_fd, client_fd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(client_addr);
    char buffer[1024];

    // 1. 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 2. 绑定地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;  // 监听所有接口
    server_addr.sin_port = htons(8080);
    bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));

    // 3. 监听
    listen(server_fd, 5);
    printf("服务器启动,等待连接...\n");

    // 4. 接受连接
    client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addr_len);
    printf("客户端连接成功!\n");

    // 5. 读取数据
    int len = read(client_fd, buffer, sizeof(buffer) - 1);
    if (len > 0) {
        buffer[len] = '\0';
        printf("收到客户端数据: %s\n", buffer);
    }

    // 6. 发送响应
    char *msg = "Hello from server";
    write(client_fd, msg, strlen(msg));

    // 7. 关闭连接
    close(client_fd);
    close(server_fd);

    return 0;
}

6. 简单TCP客户端示例(C语言)

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int sock_fd;
    struct sockaddr_in server_addr;
    char buffer[1024];

    // 1. 创建socket
    sock_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 2. 指定服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

    // 3. 连接服务器
    connect(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));

    // 4. 发送数据
    char *msg = "Hello from client";
    write(sock_fd, msg, strlen(msg));

    // 5. 读取响应
    int len = read(sock_fd, buffer, sizeof(buffer) - 1);
    if (len > 0) {
        buffer[len] = '\0';
        printf("收到服务器数据: %s\n", buffer);
    }

    // 6. 关闭socket
    close(sock_fd);

    return 0;
}

7. 常见问题和调试技巧

  • 端口被占用:检查端口是否已被其他进程占用,使用netstat -tulnp | grep 端口号
  • 防火墙阻止访问:确保防火墙开放相应端口
  • 连接超时:检查服务器是否启动、网络是否通畅
  • 字节序问题:使用htons()htonl()转换端口和IP地址,避免大小端错误
  • 阻塞和非阻塞:socket默认阻塞,复杂应用中可使用非阻塞或多线程/多进程处理并发

如果需要,我可以帮你写更复杂的示例,如多线程服务器、UDP通信、或用Python实现Socket编程示例,告诉我哈!