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

linux socket 详解

Linux Socket(套接字)是Linux操作系统提供的用于进程间通信(IPC)的一种机制,它允许不同计算机上的进程通过网络进行数据交换。Socket编程是网络编程的基础,广泛应用于各种网络应用和服务中。

基础概念

1. 套接字(Socket)

  • 套接字是一种通信端点,它允许不同主机上的进程进行双向通信。
  • 在Linux中,套接字是一种文件描述符,可以通过标准的文件操作(如read、write)进行读写。

2. 协议族(Protocol Family)

  • 常见的协议族包括IPv4(AF_INET)和IPv6(AF_INET6)。
  • 还有其他协议族,如Unix域套接字(AF_UNIX),用于同一主机上的进程间通信。

3. 套接字类型(Socket Type)

  • 流式套接字(SOCK_STREAM):提供可靠的、面向连接的通信,基于TCP协议。
  • 数据报套接字(SOCK_DGRAM):提供无连接的、不可靠的通信,基于UDP协议。
  • 原始套接字(SOCK_RAW):允许直接访问IP层,通常用于实现自定义协议。

4. 地址结构(Address Structure)

  • 对于IPv4,使用sockaddr_in结构体表示地址。
  • 对于IPv6,使用sockaddr_in6结构体表示地址。

相关优势

1. 跨平台性

  • Socket编程可以在不同的操作系统和硬件平台上实现,具有很好的可移植性。

2. 灵活性

  • 支持多种协议和通信模式,可以根据需求选择合适的套接字类型和协议。

3. 高效性

  • 直接操作网络层,减少了中间层的开销,提高了通信效率。

类型与应用场景

1. 流式套接字(TCP)

  • 应用于需要可靠传输的应用,如Web服务器、电子邮件客户端等。

2. 数据报套接字(UDP)

  • 应用于实时性要求高的应用,如在线游戏、视频会议等。

3. 原始套接字

  • 用于实现自定义的网络协议或进行网络抓包分析。

示例代码

以下是一个简单的TCP客户端和服务器的示例代码:

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);
    char buffer[1024] = {0};

    // 创建套接字
    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);
    }

    // 读取数据
    read(new_socket, buffer, 1024);
    printf("Received: %s\n", buffer);

    // 发送响应
    send(new_socket, "Hello from server", 17, 0);
    printf("Response sent\n");

    // 关闭套接字
    close(new_socket);
    close(server_fd);

    return 0;
}

TCP客户端

代码语言: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 buffer[1024] = {0};

    // 创建套接字
    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 from client", 17, 0);
    printf("Message sent\n");

    // 读取响应
    read(sock, buffer, 1024);
    printf("Received: %s\n", buffer);

    // 关闭套接字
    close(sock);

    return 0;
}

常见问题及解决方法

1. 连接超时

  • 原因:网络延迟或服务器繁忙。
  • 解决方法:增加超时设置,优化网络环境,检查服务器负载。

2. 数据丢失

  • 原因:网络不稳定或程序逻辑错误。
  • 解决方法:使用TCP协议保证数据可靠性,增加重传机制,检查代码逻辑。

3. 端口冲突

  • 原因:多个程序使用同一端口。
  • 解决方法:修改端口号,使用动态端口分配,检查系统端口占用情况。

通过以上内容,你应该对Linux Socket有了全面的了解,包括基础概念、优势、类型、应用场景以及常见问题的解决方法。

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

相关·内容

Linux C Socket Api详解

套接字描述符 首先会先到的是文件描述符,对Linux一切皆文件的哲学又多懂了一点儿点儿。 套接字是通信端点的抽象。与应用程序使用文件描述符一样,访问套接字需要使用套接字描述符。...Linux系统是小端字节序。 2.2 地址格式 地址确定了特定通信域中的套接字端点,地址格式与特定的通信域相关。...Linux中,sockaddr_in定义如下: struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct...注意:linux的man命令可以查看api的详细说明,而且还有例子,也挺不错的。 4....Linux Socket Server 与 Client 例子 个人觉得这只是套接字的入门,如果一个服务器要连接多个客户端呢?以后有机会和大家一起分享下select的套接字用法。

5.6K10
  • Linux的SOCKET编程详解

    Socket是什么 1、 socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –>...3、文件描述符和文件指针的区别: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。...详细内容请看linux文件系统:http://blog.csdn.net/hguisu/article/details/6122513#t7 4....具体如何实现,可以看看linux的内核 4.1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd...socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。

    2.6K10

    socket技术详解(看清socket编程)

    socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信,通过收集大量的资料,通过这一章节,充分的了解socket编程,文章用引用了大量大神的分析,加上自己的理解,做个总结性的文章...,我们只是知道socket编程是在tcp/IP上的网络编程,但是socket在上述的模型的什么位置呢。...socket抽象层再提供给应用层,问题又来了,应用层和socket抽象层之间和传输层,网络层之间如何通讯的呢,了解这个之前,我们还是回到原点 要想理解socket编程怎么通过socket关键词实现服务器和客户端通讯...\n”); return 0;//结束 } //创建socket这个关键词,这里想一下那个图形中的socket抽象层 //注意socket这个函数,他三个参数定义了socket...的所处的系统,socket的类型,以及一些其他信息 SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0); //socket编程中,它定义了一个结构体

    3.4K30

    网络协议之:socket协议详解之Socket和Stream Socket

    简介 不管是在普通的网络编程中还是在netty中,都经常会提到一个词叫做socket,好像socket是一个神奇的东西,使用socket我们可以建立客户端到服务器端的连接,并且和进行客户端和服务器端的通讯...Socket是什么 socket的中文翻译是套接字,个人觉的这个翻译真的是太差劲了,套接字听起来毫无意义,所以很多人在第一次听到socket这个词的时候肯定很迷茫。 那么什么是socket呢?...socket建立连接的基础是IP协议,IP协议被用来进行数据的封装和分组,然后才能够在网络上进行传输。这种依赖于IP协议的socket,又叫做network socket。...Socket呢?...总结 到此,我们介绍了Socket的基本分类Stream Socket的含义,并且使用unix中的工具搭建了socket服务器和客户端,当然这只是最简单的说明描述,大家用来体会Stream Socket

    2.1K21

    Linux Socket 收发Json

    如果对你有帮助,麻烦点个在看或点个赞,感谢~ 不管是Qt开发还是linux 嵌入式应用开发,一个人的核心竞争力还是不断思考,也就是不断琢磨。...下面的程序主要是Linux C Socket 读取JSON文件并传输,然后再写入文件,其中使用了cJSON库,关于cJSON库不过多介绍,主要介绍整体的思路。 1....Server 端 使用的是socket 阻塞式,没有使用select、poll、epoll等 接收端按照JSON格式解析数据,并提取感兴趣Key所对应的Value 程序功能挺快就可以做好,做完之后进行拆解...,将socket通信独立出来,JSON解析、写文件、响应客户端JSON数据等分别写成函数。...小结 编译JSON时需要链接linux的数学库 自己琢磨如何拆解函数功能 应用程序也主要是调用别人的api,那么你的核心竞争力是什么呢 ? 如需程序工程可在公众号后台留言。

    4.7K20

    网络协议之:socket协议详解之Datagram Socket

    简介 上一篇文章我们讲解了Socket的分类和最常用到的Stream Socket,Stream Socket一般是基于TCP协议的,所以我们经常在web服务中能够看到他们的身影。...当然TCP协议有个孪生兄弟叫做UDP,那么基于UDP来做传输协议的socket协议就叫做Datagram Socket,今天我们一起来详细了解一下Datagram Socket。...什么是Datagram Socket 和有连接的Stream Socket不同,Datagram Socket是无连接的。...有连接的Stream Socket表明这个socket是稳定可靠的,所以我们可以在Stream socket中进行稳定的数据传输,当然这个稳定是说数据包不会丢失,但是并不一定能够确保数据包不被篡改。...本文已收录于 http://www.flydean.com/16-datagram-socket/

    1.4K30
    领券