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

linux socket 原理

Linux Socket(套接字)是Linux操作系统提供的一种网络通信机制,它允许不同计算机上的进程通过网络进行数据交换。Socket编程是一种网络编程模型,它提供了一种标准的方法来创建、发送和接收数据,使得应用程序能够通过网络进行通信。

基础概念

  1. Socket: 套接字是一种通信端点,它允许不同计算机上的进程通过网络进行数据交换。
  2. IP地址: 用于标识网络中的设备。
  3. 端口号: 用于标识设备上的特定进程。
  4. 协议: 定义了数据传输的规则,如TCP(传输控制协议)和UDP(用户数据报协议)。

工作原理

  1. 创建Socket: 使用socket()函数创建一个套接字。
  2. 绑定地址: 使用bind()函数将套接字与特定的IP地址和端口号绑定。
  3. 监听连接: 使用listen()函数使套接字进入监听状态,等待客户端连接。
  4. 接受连接: 使用accept()函数接受客户端的连接请求。
  5. 发送和接收数据: 使用send()recv()函数进行数据的发送和接收。
  6. 关闭Socket: 使用close()函数关闭套接字。

优势

  1. 跨平台: Socket编程可以在不同的操作系统上运行。
  2. 灵活性: 支持多种协议(TCP/UDP),适用于不同的应用场景。
  3. 高效性: 直接与操作系统底层网络接口交互,性能较高。

类型

  1. 流式Socket (SOCK_STREAM): 基于TCP协议,提供可靠的、面向连接的通信。
  2. 数据报Socket (SOCK_DGRAM): 基于UDP协议,提供不可靠的、无连接的通信。

应用场景

  1. Web服务器和客户端: 使用HTTP协议进行通信。
  2. 即时通讯软件: 使用TCP或UDP协议进行实时消息传递。
  3. 文件传输: 使用FTP协议进行文件上传和下载。
  4. 远程登录: 使用SSH协议进行安全的远程登录。

示例代码

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

    // 创建socket
    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);

    // 关闭socket
    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};

    // 创建socket
    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);

    // 接收数据
    read(sock, buffer, 1024);
    printf("Received: %s\n", buffer);

    // 关闭socket
    close(sock);

    return 0;
}

常见问题及解决方法

  1. 连接超时: 可能是由于网络延迟或服务器负载过高导致的。可以通过设置合适的超时时间来解决。
  2. 数据丢失: 可能是由于网络不稳定或程序逻辑错误导致的。可以通过增加重传机制和错误处理来解决。
  3. 端口冲突: 可能是由于多个程序使用了相同的端口号导致的。可以通过修改端口号或使用动态端口分配来解决。

通过理解Socket的工作原理和相关概念,可以更好地进行网络编程和解决相关问题。

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

相关·内容

Socket原理

以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。 一个生活中的场景。...生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。 图3 先从服务器端说起。...这些都得靠socket?那什么是 socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下: 1、网络中进程之间如何通信?...socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。...普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。

54421
  • socket编程原理

    socket编程原理 1、问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close...系统条调用 ---- 为了更好地说明套接字编程原理,下面给出几个基本套接字系统调用说明。...3.1 创建套接字──socket() 应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下: SOCKET PASCAL FAR socket...如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。 accept()用于面向连接服务器。...如果消息没有被及时从缓存区取走,下次在取数据的时候可能就会出现一次取出多个数据包的情况,造成粘包现象(确切来讲,对于基于TCP协议的应用,不应用包来描述,而应 用 流来描述),个人认为服务器接收端产生的粘包应该与linux

    1.6K20

    Socket 编程原理

    目录 socket编程 基本概念 编程流程 socket函数 协议 TCP UDP DNS HTTP HTTPS socket编程 基本概念 socket编程即计算机网络编程...在 Unix/Linux 中执行任何形式的 I/O 操作(比如网络连接)时,都是在读取或写入一个文件描述符,而在 Windows 中则被称为文件句柄,其本质都是一个东西,但是 Windows系统会把 socket...1、socket() 这个函数作用是创建一个 socket 的操作对象,它被用作 socket 描述符的唯一标识(相当于文件描述符),在本地我们可以用这个对象进行文件操作,在主机远程连接时则可以用于建立连接...上面的原理看起来很复杂,但是在 socket 层面就简化了很多,双方在连接前都要先建立好套接字,服务端还要开启监听,准备工作就完成了。...编程 Python socket 编程 PHP socket 编程 Java socket 编程 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    52560

    Socket通信原理

    3.Socket是 大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Socket通信原理,希望能够帮助大家进步!!!    ...Socket在哪里呢? 在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。 原来Socket在这里。 Socket是什么呢?...以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。 一个生活中的场景。...生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。 先从服务器端说起。...socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。

    90210

    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

    Linux系统下socket编程socket接口介绍(二)

    前言 在上一篇文章里面我们介绍了TCP的三次握手和四次挥手过程的介绍以及网络编程里面的一些api接口函数的介绍——Linux系统下socket编程之socket接口介绍(一)。...函数介绍 - 发送和接收 - (1)send和write: 首先说明的一点,之前介绍的socket这个函数,非常类似我们之前介绍的open函数,他们都会返回一下文件描述符;所以这里的send函数和write...函数作用类似,我们用man手册来查看它的具体形式和用法: #include #include socket.h> ssize_t send(int...(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序,这两个函数先不讲,实战遇到的话,再进行解析),具体可以看下面Linux的源文: inet_aton...(2)struct sockaddr,这个结构体是linux的网络编程接口中用来表示IP地址的 标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。

    3.8K20

    linux udp编程_linux中socket编程

    在前面的文件中,我们介绍了linux网络编程中与IP相关的知识和常用的函数总结,本文针对具体的UDP通信,来详细的介绍UDP通信的使用,包括UDP通信中的点对点通信,多播,广播等。...当然,在我们服务端创建socket后,主动往外发送一个数据,这样即使我们不进行绑定,我们依然可以收到数据,这只是系统通过我们的发送,自动的绑定了一个端口,这个并不是我们想要的,实际的使用中,也并不推荐这种方式...后,配置一下套接字,允许进行发送广播消息,上代码 int set_broadcast = 1; setsockopt(socket, SOL_SOCKET, SO_BROADCAST, &set_broadcast...解决方法如下:(允许端口重用) int on = 1; ret = setsockopt(udp_net_sta.socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof...(int)); if (ret < 0) { perror("socket set SO_REUSEADDR failed"); } 2、服务端程序,在创建完socket后,有一个bind的操作

    11.1K10
    领券