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

linux socket 接口

Linux Socket接口是Linux操作系统中用于实现网络通信的一种机制。它允许不同计算机上的进程通过网络进行数据交换。Socket接口提供了一种标准化的方式,使得开发者可以方便地创建和使用网络连接。

基础概念

  1. Socket(套接字):Socket是网络通信的端点,它允许不同主机上的进程进行双向通信。
  2. IP地址:标识网络中的设备。
  3. 端口号:用于区分同一台计算机上的不同服务。
  4. 协议:如TCP(传输控制协议)和UDP(用户数据报协议),定义了数据传输的方式。

优势

  • 跨平台性:Socket编程可以在不同的操作系统上运行。
  • 灵活性:支持多种传输协议和地址族。
  • 广泛的应用:几乎所有的网络应用程序都使用Socket进行通信。

类型

  • 流式Socket(SOCK_STREAM):基于TCP协议,提供可靠的、面向连接的通信。
  • 数据报Socket(SOCK_DGRAM):基于UDP协议,提供不可靠的、无连接的通信。
  • 原始Socket(SOCK_RAW):允许访问底层协议,通常用于网络诊断和新的协议实现。

应用场景

  • Web服务器和客户端:HTTP请求和响应。
  • 即时通讯软件:聊天应用。
  • 文件传输:FTP服务。
  • 远程登录: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);
    }

    // 绑定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");
        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("Message from client: %s\n", buffer);

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

    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", strlen("Hello from client"), 0);
    printf("Message sent\n");

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

    return 0;
}

常见问题及解决方法

  1. 连接超时
    • 原因:网络延迟或目标主机不可达。
    • 解决方法:增加超时时间或检查网络连接。
  • 数据丢失
    • 原因:网络不稳定或程序错误。
    • 解决方法:使用TCP协议保证数据可靠性,或在应用层实现重传机制。
  • 端口冲突
    • 原因:多个服务尝试使用同一端口。
    • 解决方法:更改服务使用的端口号或确保端口唯一性。

通过理解这些基础概念和常见问题,你可以更有效地进行Linux Socket编程。

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

相关·内容

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

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

3.8K20

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

在socket编程中,这一过程由客户端执行connect来触发(这个下面接口函数会有介绍的)。...: 在讲解这个之前,你得必须要明白在Linux系统下,一切皆是文件,(举个简单的例子,一般我们在Windows系统下,你是可以清楚的看到硬盘盘符,并标有大小的,可以直接用鼠标拖拉文件到里面去;而在Linux...因为后面接口函数里面的参数就有这个socket描述符(如果你第一次看到这个可能就有点懵逼了,不知道为啥要有这个东西),其实它和我们之前一系列的文章里讲的文件描述符是一样的(文件描述符这里就不介绍了,前面对文件操作的文章里面已经很详细的介绍了这个...三、使用打电话的形式来介绍socket接口函数: 1、调用socket函数(安装电话机)时进行的通话: 问:"接电话需要准备什么?" 答:"当然是电话机!"...Since Linux 2.6.27, the type argument serves a second purpose: in addition to specifying a socket type

3K10
  • socket接口层分析

    在Linux内核中,Socket的实现分为三层,第一层是 GLIBC接口层,第二层是 BSD接口层,第三层是 具体的协议层(如Unix sokcet或者INET socket)。如下图所示: ?...BSD层在内核态实现,主要是为了让不同的协议能够使用同一套接口来访问而创造的,如上图所示, Unix socket 和 Inet socket 都可以通过接入 BSD接口层 来向用户提供相同的接口。...GLIBC接口层 GLIBC接口层 提供了一系列的接口函数供用户使用(可以成为 Socket族系统调用),如下: socket() bind() listen() accept() connect()...为了实现这种机制,Linux定义了一个 struct socket 的结构体,每个socket都与一个 struct socket 的结构对应,其定义如下: struct socket { socket_state...而参数 args 就是在用户态给 Socket族系统调用 传入的参数列表地址,Linux内核会先使用 copy_from_user() 函数把这些参数复制到内核空间。

    1.1K20

    【Linux】: Socket 编程

    Socket 编程 6.1 socket 常见API Socket API 是一层网络编程接口,抽象了底层的网络协议,定义在 netinet/in.h 中。...所以未来要完成这三种通信就需要有三套不同接口,但是思想上用的都是套接字的思想。因此接口设计者不想设计三套接口,只想设计一套接口,可以通过不通的参数,解决所有网络或者其他场景下的通信网络。...通过这种设计,Socket API 可以通过统一的函数接口,处理不同类型的地址格式。...总的来说 通过 sockaddr 结构体,Socket API 实现了网络通信和本地通信的统一接口 它的设计理念类似于“多态”,即通过一个通用的接口来处理多种类型的地址格式 7....Socket 接口 7.1 创建 Socket 文件描述符 在 TCP 和 UDP 通信中,首先要创建一个 Socket 文件描述符,它本质上是一个网络文件。

    14010

    socket接口api的深度探究

    一、socket接口使用 1.1 socket抽象层 Linux内核net/socket.c定义了一套socket的操作api。图1展示了socket层所处与TCP/IP协议栈之上和应用层之下。...so_xxx: 内核相关socket操作接口。socket object操作协议栈的api入口。 in_pcballoc()。...tcp_attach(). tcp_xxx: tcp_close(), tcp_disconect(),tcp_drop() pr_xxx: 一套socket层和协议栈通信的接口,包括pr_usrreq...(原则上该竞争在那些新建文件描述符的调用中都存在,所以很多linux的系统调用都做了类似的处理) image.png 1.3.6 send/write函数 功能:发送数据 实现:验证socket和connection...image.png 1.3.7 recv/read函数 功能:接收数据 实现:除了拷贝内核接收区的数据到应用层,还发送窗口更新信息给网络对端 注意:recv和send一样也提供了4套接口:recvfrom

    2.8K370

    socket接口开发和测试初探

    由于接下来有一个聊天室需求的项目,所以在确定完技术方案后,就要开始着手socket协议的接口测试准备了。...看了好几个不同的socket client实现,就这个最简单。 大概抄了一下Demo的代码,但是问题来了,手头没有Websocket接口可提供测试的,着实有点尴尬。...我觉得本次socket协议接口测试的学习这两天,抄代码对我的意义主要两点:1、能够迅速掌握一种解决问题的方案。2、能够迅速掌握该框架的基本功能的使用。...INFO-> 开始建立socket连接... INFO-> 开始建立socket连接... WARN-> 世界喊话器 用户:FunTester2已经上线了!...INFO-> socket关闭... WARN-> 世界喊话器 用户:FunTester3已经离线了! INFO-> socket关闭...

    1.2K50

    Linux网络操作的通用接口:Socket到底是怎么使用的?

    于是,在这种背景下,操作系统的构建者为我们提供了很好的支持,他们将底层屏蔽,抽象出了一个统一的网络操作接口,来便于上层用户使用网络,这个统一网络操作接口就是socket体系。...因为是操作系统层面封装提供的机制体系,因此其具体使用需要以系统调用的形式来实现,常见的socket相关系统调用有:socket:创建socket,所有socket操作的第一步,socket接口体系提供了非常多种类的...很大一部分功能是提供四层、也就是传输层网络之上的接口,但却并非所有操作都是基于四层的,后面我们可以了解到还有其他基于层面的socket。...EOF 相关字样或是 connection reset by peer、Broken pipe(对应Linux EPIPE错误码) 类的报错。...总结本篇文章,笔者介绍了关于socket这个抽象接口体系中最重要和基础的一些内容,相信应该能够为对socket认识模糊的读者提供一些帮助。

    13010

    linux下socket编程

    Socket soket接口是TCP/IP网络的API。网络的socket数据传输是一种特别的I/O,socket也是一种文档描述符。...常用的socket类型有:流式socket(SOCK_STREAM)、数据报socket(SOCK_DGRAM)....其中流式socket是采用面向连接的TCP服务,而数据报socket则是无连接的UDP服务 Socket建立     调用: int socket(int domain, int type, int...配置     面向连接的socket客户端通过调用connet函数在socket数据接口中保存本地和远端信息,无连接socket的客户端和服务端联通面向连接socket的服务端通过调用bind函数来配置本地信息...收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍能够继续在以前的 socket上监听,同时能够在新的

    4K70

    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 udp编程_linux中socket编程

    在前面的文件中,我们介绍了linux网络编程中与IP相关的知识和常用的函数总结,本文针对具体的UDP通信,来详细的介绍UDP通信的使用,包括UDP通信中的点对点通信,多播,广播等。...optlen); 常见组播设置选项如下: 其中: 选项IP_MULTICASE_TTL:设置超时时间,其值optval的设置范围为0-255 选项IP_MULTICAST_IF:设置组播的默认默认网络接口...,会从给定的网络接口发送,另一个网络接口会忽略此数据 选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP:加入或者退出一个组播组其参数为一个结构体 使用组播的一个基本编程流程如下...解决方法如下:(允许端口重用) 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

    【1】HTTP协议和Socket接口区别

    内容提要:     1.网络七层模型     2.什么是HTTP协议     3.什么是Socket接口 1.网络七层模型 ? ?...3.什么是Socket接口 Socket接口是对TCP/UDP协议封装的接口。 要想明白 Socket,必须要理解 TCP 连接。...Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。...创建 Socket 连接的时候,可以指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之。...Socket为长连接:通常情况下Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通讯双方开始互发数据内容,直到双方断开连接。

    1.8K10
    领券