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

linux socket()

Linux socket() 基础概念

socket() 是 Linux 系统中的一个系统调用,用于创建一个套接字(socket),它是网络通信的基础。套接字是一种抽象的端点,用于在网络上进行数据交换。

基本概念

  1. 套接字类型
    • 流式套接字(SOCK_STREAM):提供可靠的、面向连接的通信流,通常使用 TCP 协议。
    • 数据报套接字(SOCK_DGRAM):提供无连接的数据报服务,通常使用 UDP 协议。
    • 原始套接字(SOCK_RAW):允许访问底层协议,如 IP 或 ICMP。
  • 地址族
    • AF_INET:IPv4 地址族。
    • AF_INET6:IPv6 地址族。
    • AF_UNIX:用于本地进程间通信。

相关优势

  • 灵活性:支持多种协议和地址族,适用于不同的网络环境和需求。
  • 可扩展性:可以轻松地扩展到新的协议和服务。
  • 跨平台性:大多数操作系统都支持类似的套接字接口,便于跨平台开发。

类型与应用场景

  • TCP 套接字:适用于需要可靠传输的应用,如网页浏览、文件传输等。
  • UDP 套接字:适用于实时性要求高的应用,如在线游戏、视频会议等。
  • 原始套接字:通常用于网络协议分析、安全研究等高级用途。

示例代码

以下是一个简单的 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);

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

    // 绑定套接字
    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");
        exit(EXIT_FAILURE);
    }

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

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

    char buffer[1024] = {0};
    read(new_socket, buffer, 1024);
    printf("Received: %s\n", buffer);

    close(new_socket);
    close(server_fd);
    return 0;
}

客户端代码

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

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    // 将IP地址转换为二进制形式
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }

    send(sock, hello, strlen(hello), 0);
    printf("Hello message sent\n");
    return 0;
}

常见问题及解决方法

1. 无法创建套接字

  • 原因:可能是权限问题或系统资源不足。
  • 解决方法:检查权限设置,确保有足够的系统资源。

2. 绑定失败

  • 原因:端口已被占用或地址无效。
  • 解决方法:使用 netstatlsof 检查端口占用情况,确保使用的地址有效。

3. 连接超时

  • 原因:网络问题或服务器未启动。
  • 解决方法:检查网络连接,确保服务器端程序正常运行。

通过以上信息和示例代码,你应该能够更好地理解 Linux 中的 socket() 系统调用及其应用。

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

相关·内容

7分32秒

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

2分40秒

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

3分24秒

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

19分30秒

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

6分49秒

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

4分4秒

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

5分26秒

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

8分13秒

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

6分20秒

IC测试工程师:深入了解SiC芯片Pogo-Pin测试及Test Socket的用途

4分32秒

IC test socket工程师分享案例:多倍压压电式蜂鸣器驱动集成电路IC解析

19分46秒

02 -Linux简介-Linux版本

18分10秒

01-linux教程-linux简介

领券