Linux报 “socket operation on non-socket” 异常的原因以及解决办法

socket operation on non-socket这个错误通常出现在Linux系统中,主要是由于程序在对一个非socket文件描述符进行了套接字操作所导致的。这个错误提示通常会出现在网络编程中,比如使用非socket类型的文件描述符调用网络库函数,或者是使用了已经被关闭的socket文件描述符调用网络库函数。

造成socket operation on non-socket错误的原因可能有下面几个:

1.在调用socket相关函数前,没有初始化socket库,或初始化失败。

2.在关闭socket描述符使用shutdown函数后,继续对该socket文件描述符进行操作。

3.使用了一个根本不是socket描述符的文件描述符调用网络库函数。

以下是一些具体的示例:

1.没有初始化socket库

//Example 1:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>

// 没有初始化socket库,调用socket函数
int main(void)
{
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    close(fd);
    return 0;
}

在这个例子中,socket库没有被初始化,导致调用socket函数失败。需要先调用inet_pton函数进行socket库的初始化。

2.使用了已关闭的socket文件描述符

//Example 2:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main(void)
{
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    close(fd);

    // 使用了已经关闭的socket文件描述符调用网络库函数
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8888);
    addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    return 0;
}

在这个例子中,调用了已经关闭的fd文件描述符调用网络库函数,导致出现socket operation on non-socket的错误提示。需要在调用网络库函数前,检查fd是否已关闭。

3.使用了非socket描述符

//Example 3:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

int main(void)
{
    // 使用了非socket描述符,调用listen函数
    int fd = open("/dev/zero", O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    if (listen(fd, 5) < 0) { //调用listen函数
        perror("listen");
        exit(EXIT_FAILURE);
    }

    close(fd);
    return 0;
}

在这个例子中,一个非socket描述符被传递给listen函数,导致出现socket operation on non-socket的错误提示。

解决上述问题的方法:

1.在使用socket相关函数前,先初始化socket库。

2.在关闭socket描述符时,将描述符从epoll中删除,并保证不会再对该socket文件描述符进行操作。

3.在使用文件描述符调用网络库函数前,先检查该描述符是否为已打开的socket描述符。

正确的socket库初始化方法:

//正确的socket库初始化方法
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>

int main(void)
{
    //正确的初始化socket库
    int ret = system("cat /dev/null > /dev/tcp/127.0.0.1/80");
    if (ret != 0) {
        perror("init socket");
        exit(EXIT_FAILURE);
    }

    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    close(fd);
    return 0;
}

以上是关于Linux报socket operation on non-socket的原因与解决办法的介绍和示例。希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux报 “socket operation on non-socket” 异常的原因以及解决办法 - Python技术站

(1)
上一篇 2023年3月24日
下一篇 2023年3月24日

相关文章

  • Linux报 “too many symbolic links encountered” 异常的原因以及解决办法

    概述: 当在Linux中使用符号链接创建嵌套目录结构时,可能会遇到 “too many symbolic links encountered” 错误。这种错误通常是由于符号链接进入无限循环环引起的。本文将介绍符号链接和该错误的原因,以及解决这个问题的几种方法和示例。 什么是符号链接? 符号链接是一个特殊的文件类型,可以引用其他文件或目录。简单来说,符号链接是…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “too many links” 异常的原因以及解决办法

    当在 Linux 文件系统中创建大量硬链接时,可能会出现”too many links”的错误。这是由于 Linux 中使用的文件系统有一个硬链接的最大数量限制,如果超过了这个限制,将会导致无法创建更多的硬链接。本文将介绍原因与解决方法。 原因: 在 Linux 中每个文件都有一个引用计数器,当我们创建一个链接时,计数器的值就会增加1。这个计数器值的最大限制…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “socket not connected” 异常的原因以及解决办法

    下面是对于Linux报socket not connected错误的原因与解决办法的详细讲解: 错误原因 socket not connected错误通常出现在使用socket进行网络编程时,当客户端(或者服务端)尝试发送数据时,发现该socket还没有连接。错误信息一般会显示如下: send() failed (errno: 107, socket not…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “invalid argument to attach” 异常的原因以及解决办法

    当在Linux系统上执行类似ptrace,strace等调试工具时,可能会出现错误提示“invalid argument to attach”,这通常是由于系统安全机制限制导致的。 操作系统提供了一个安全机制称为“安全洞渐进式防护”(Security Hole Progress Protection, 以下简称SHPP),该机制限制了其他进程对正在运行进程的…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “name too long” 异常的原因以及解决办法

    当我们在Linux系统中进行文件操作时,有时候会遇到报错提示 “file name too long”,例如: $ mv my_long_long_long_filename.txt newfilename.txt mv: cannot move ‘my_long_long_long_filename.txt’ to ‘newfilename.txt’: F…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “file or directory already exists” 异常的原因以及解决办法

    Linux系统中如果您创建一个已经存在的目录或文件,就会出现“file or directory already exists”(文件或目录已存在)的错误提示。这通常是由于使用重复的文件或目录名导致的。 以下是一些可能出现“file or directory already exists”错误的常见情况和对应的解决办法: 1. 创建目录时,目录已经存在 如果…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “transport endpoint is not connected” 异常的原因以及解决办法

    transport endpoint is not connected 是Linux系统中的一种错误,在使用某些系统调用或文件句柄时,可能会出现transport endpoint is not connected的错误。 原因 这个错误通常会在操作关闭了的网络套接字时发生。在网络编程中,一个套接字(socket)是一个文件描述符(file descript…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “device is not a shared memory segment” 异常的原因以及解决办法

    当在Linux系统上运行程序时,可能会遇到 device is not a shared memory segment 的错误信息。这个错误通常是由于程序尝试使用不存在或已经被删除的共享内存段而引起的。下面是具体的原因和解决方案: 原因 共享内存段不存在或已被删除:如果程序试图访问不存在或已被删除的共享内存段,则会出现 device is not a sha…

    Linux常见异常 2023年3月24日
    00
合作推广
合作推广
分享本页
返回顶部