首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux使用socket

Linux 使用 Socket 的基础概念

Socket(套接字)是一种网络通信机制,允许不同计算机上的进程通过网络进行数据交换。在 Linux 系统中,Socket 是实现网络编程的基础。

基础概念

  1. IP 地址:标识网络中的设备。
  2. 端口号:标识设备上的特定进程。
  3. 协议:如 TCP(传输控制协议)和 UDP(用户数据报协议),定义数据传输的方式。

相关优势

  1. 跨平台性:Socket 编程可以在不同的操作系统上运行。
  2. 灵活性:支持多种网络协议和通信模式。
  3. 高效性:能够处理大量并发连接。

类型

  1. 流式套接字(SOCK_STREAM):基于 TCP 协议,提供可靠的、面向连接的数据传输。
  2. 数据报套接字(SOCK_DGRAM):基于 UDP 协议,提供无连接的数据传输,速度较快但不保证数据完整性。
  3. 原始套接字(SOCK_RAW):允许直接访问网络层协议,如 IP 和 ICMP。

应用场景

  • Web 服务器和客户端:HTTP、HTTPS 协议。
  • 即时通讯应用:如聊天软件、在线游戏。
  • 文件传输服务:FTP 协议。
  • 远程登录服务:SSH 协议。

示例代码

TCP 客户端示例

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int sockfd;
    struct sockaddr_in server_addr;

    // 创建 socket
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

    // 连接服务器
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 发送数据
    char *message = "Hello, Server!";
    send(sockfd, message, strlen(message), 0);

    // 接收数据
    char buffer[1024];
    int bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
    buffer[bytes_received] = '\0';
    printf("Received: %s\n", buffer);

    // 关闭 socket
    close(sockfd);
    return 0;
}

TCP 服务器示例

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);

    // 创建 socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 绑定 socket
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 接收数据
    char buffer[1024] = {0};
    int bytes_received = recv(new_socket, buffer, sizeof(buffer), 0);
    printf("Received: %s\n", buffer);

    // 发送数据
    char *response = "Hello, Client!";
    send(new_socket, response, strlen(response), 0);

    // 关闭 socket
    close(new_socket);
    close(server_fd);
    return 0;
}

常见问题及解决方法

1. 连接超时

原因:可能是网络延迟或服务器未响应。 解决方法:增加超时设置,检查服务器状态。

代码语言:txt
复制
struct timeval timeout;
timeout.tv_sec = 5;  // 5秒超时
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));

2. 数据丢失

原因:网络不稳定或程序逻辑错误。 解决方法:使用可靠的传输协议(如 TCP),增加数据校验机制。

3. 端口冲突

原因:多个程序尝试绑定同一端口。 解决方法:检查正在运行的程序,更改端口号。

代码语言:txt
复制
server_addr.sin_port = htons(8081);  // 更改端口号

通过以上示例和解决方案,您可以更好地理解和应用 Linux 中的 Socket 编程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

14分52秒

51-linux教程-linux中RPM命令使用

11分32秒

53-linux教程-linux中YUM命令使用

7分32秒

07-尚硅谷-Java NIO-Channel-Socket通道-概述

3分28秒

Linux反弹SHELL的使用介绍

2分40秒

golang教程 go语言基础 121 网络常识:Socket简介 学习猿地

3分24秒

191 - 尚硅谷 - SparkStreaming - DStream创建 - Socket数据采集器源码解读

19分30秒

Node.js入门到实战 17 Socket.io初体验 学习猿地

10分16秒

06、环境-使用vagrant快速创建linux虚拟机

6分49秒

国产光芯片的崛起:光芯片高低温测试-测试座socket解决方案

4分4秒

035_第五章_DataStream API(基础篇)(三)_源算子(四)_读取Socket文本流

5分26秒

国产功率器件IGBT模块封装与测试,IGBT测试座socket-关键测试连接器

8分13秒

31-尚硅谷-深入解读Java12&13-Java13新特性:重新实现旧版Socket API

领券