在 C 客户端服务器应用程序中,socket() 返回 0

2024-02-18

我正在开发一个应用程序,其中包含多个服务器套接字,每个服务器套接字都在唯一的线程中运行。
外部实用程序(脚本)由线程之一调用。该脚本调用一个实用程序(客户端),该实用程序将消息发送到服务器套接字之一。

最初,我使用的是system()来执行这个外部脚本,但我们不能使用它,因为我们必须确保在分叉来执行外部脚本的子进程中关闭服务器套接字。
我现在打电话fork() and execvp()我。我fork()然后在孩子中我关闭所有服务器套接字,然后调用execvp()执行脚本。

现在,所有这些都运行良好。问题是脚本有时会向服务器应用程序报告错误。该脚本通过调用另一个打开 TCP 套接字并发送适当数据的应用程序(客户端)来发送这些错误。我的问题是客户端应用程序的值是0由返回socket()系统调用。

注意:仅当使用我的 forkExec() 函数调用脚本/客户端应用程序时才会发生这种情况。如果手动调用脚本/客户端应用程序socket()呼叫执行正常,一切正常。

根据这些信息,我怀疑这是我下面的 fork() execvp() 代码中的内容......有什么想法吗?

void forkExec()
{    
    int stat;

    stat = fork();
    if (stat < 0)
    {
        printf("Error forking child: %s", strerror(errno));
    }
    else if (stat == 0)
    {
        char *progArgs[3];

        /*
         * First, close the file descriptors that the child 
         * shouldn't keep open
         */
        close(ServerFd);
        close(XMLSocket);
        close(ClientFd);
        close(EventSocket);
        close(monitorSocket);

        /* build the arguments for script */
        progArgs[0] = calloc(1, strlen("/path_to_script")+1);
        strcpy(progArgs[0], "/path_to_script");
        progArgs[1] = calloc(1, strlen(arg)+1);
        strcpy(progArgs[1], arg);
        progArgs[2] = NULL; /* Array of args must be NULL terminated for execvp() */

        /* launch the script */
        stat = execvp(progArgs[0], progArgs);
        if (stat != 0)
        {
            printf("Error executing script: '%s' '%s' : %s", progArgs[0], progArgs[1], strerror(errno));
        }
        free(progArgs[0]);
        free(progArgs[1]);
        exit(0);
    }

    return;
}

客户端应用程序代码:

static int connectToServer(void)
{
int socketFD = 0;
int status;
struct sockaddr_in address;
struct hostent* hostAddr = gethostbyname("localhost");

socketFD = socket(PF_INET, SOCK_STREAM, 0);

上面的调用返回0。

if (socketFD < 0)
{
    fprintf(stderr, "%s-%d: Failed to create socket: %s", 
                                __func__, __LINE__, strerror(errno));
    return (-1);
}

memset(&address, 0, sizeof(struct sockaddr));
address.sin_family = AF_INET;
memcpy(&(address.sin_addr.s_addr), hostAddr->h_addr, hostAddr->h_length);
address.sin_port = htons(POLLING_SERVER_PORT);

status = connect(socketFD, (struct sockaddr *)&address, sizeof(address));
if (status < 0)
{
    if (errno != ECONNREFUSED)
    {
        fprintf(stderr, "%s-%d: Failed to connect to server socket: %s",
                   __func__, __LINE__, strerror(errno));
    }
    else
    {
        fprintf(stderr, "%s-%d: Server not yet available...%s",
                   __func__, __LINE__, strerror(errno));
        close(socketFD);
        socketFD = 0;
    }
}

return socketFD;
}

FYI
操作系统:Linux
架构:ARM32
内核:2.6.26


socket() 出错时返回 -1。

返回 0 意味着 socket() 成功并为您提供了文件描述符 0。我怀疑您关闭的文件描述符之一具有文件描述符 0,一旦关闭,对分配文件描述符的函数的下一次调用将返回 fd 0因为它是可用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 客户端服务器应用程序中,socket() 返回 0 的相关文章

  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • Docker exec linux 终端创建别名

    我有一个正在运行且独立的容器 我想在附加到该容器之前创建一个命令别名 当我连接到容器并输入 alias bar foo 创建别名 并可以通过以下方式检查 alias command 但如果我想做同样的事情码头执行者命令即这样 docker
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • 错误号:11,资源暂时不可用

    我正在使用 c 套接字来实现可靠的 UDP 协议 我正在使用以下代码在等待确认的套接字上设置超时 我不确定为什么会收到 errno 11 资源暂时不可用 set timer for recv socket struct timeval tv
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 在Python中通过套接字发送文件

    我正在尝试用 python 编写一个实现套接字的程序 每个客户端发送一个 PDF 文件 服务器接收该文件并将标题更改为 file number pdf 例如 file 1 pdf 出现的问题是只有客户端才能成功发送文件 当第二个客户端尝试发
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • 我可以在 Ubuntu 上使用 Homebrew 吗?

    我只是尝试使用 Homebrew 和 Linuxbrew 在我的 Ubuntu 服务器上安装软件包 但都失败了 这就是我尝试安装它们的方法 sudo apt get install build essential curl git m4 r
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉

随机推荐

  • Java的全栈框架[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个完整的 Java 堆栈框架 从持久性到视图生成 CRUD 我没有使用 Rails 风格框
  • 模板中的类使用不完整

    我感到非常惊讶的是 在 g 的各种采样版本上 以下内容编译时没有错误或警告 Adapted from boost checked delete template
  • 什么是健全的编程语言?

    根据达特的网站 https www dartlang org guides language sound dart Dart 是一种声音语言 上面这句话中的 声音 是什么意思 我在其他主要编程语言中找不到任何类似的概念 谁能举出一些其他例子
  • 如何使用基于 XML 的 GUI 布局生成 python GUI?

    我在 Photoshop 中设计了一个自定义 UI 现在我想使用 XML 来创建 Python 的 GUI 我看到了这个网站http wiki xbmc org index php title WindowXML http wiki xbm
  • 与 Pandoc 一起使用的表布局

    我正在尝试创建文档生成工作流程 专业文档 目标是尽可能多地用 Markdown 编写 生成的文档应该是 PDF 同时仍然能够在必要时导出为 docx 我选择了 Pandoc 我将为其创建一个 Latex 模板并使用 YAML 文档来保存文档
  • 如何使用 NSURLConnection 下载文件?

    我想问一个关于目标 C 的问题 我想从 iPhone 应用程序中的服务器 CardDav 服务器 下载 vcf 文件 在我阅读了Apple Developer的API和库之后 我发现我应该使用NSURLConnection 类 http d
  • 使用Windows Auth对用户进行身份验证,然后在ASPNET Core 2.1中生成JWT

    我有一个 ASP NET Core 2 1 WebApi 我在其中实现了 JWT 身份验证 用户调用api authentication authenticate 在消息正文中传递他们的用户名 密码 并返回 JWT 然后他们使用该 JWT
  • ASP.NET 样板模板中的角色和权限有什么区别?

    在ASP NET Boilerplate中 为什么有角色和权限来控制授权呢 两者有什么区别 Role 一组权限
  • 如何在python中随机合并两个列表的两个元素并确保结果条目都是唯一的?

    我有两个列表 A 和 B 它们具有相同数量的元素 但每个列表中的元素不一定不同 我想通过随机耦合 A 和 B 中的元素来形成一个新列表 随机配对很重要 但是 我还需要确保结果列表中的每一对都是唯一的 到目前为止 我一直在按如下方式处理这个问
  • 虚拟方法被调用而不是重写

    我有四节课Event and Action这两个都是基类 然后我有两个子类Create Event and MoveTo Action Event包含一个列表Action实例 以及何时Trigger 被称为孩子Create它调用Event
  • IIS + 压缩 webpack-插件 (gzip) - 带有源的“脚本”加载失败

    I use 压缩 webpack 插件用于将 ASP NET MVC 5 项目中的 javascript 文件压缩为 gz 格式 我的一部分webpack config js with 压缩 webpack 插件设置 const Compr
  • 从 Golang 的阅读器中读取 < 8 位

    在 Golang 中处理原始 IP 包时 我遇到了一个问题 我似乎找不到解决方案 The IPv4规范 https www rfc editor org rfc rfc791包含小于 8 位的字段 例如 版本或标头长度 各 4 位 或标志
  • 在 iPhone MKMapView 中显示用户位置蓝点

    我正在 iPhone 应用程序的 MapView 中开发自定义引脚 这是代码 MKAnnotationView mapView MKMapView mapView viewForAnnotation id
  • 传递给 http.HandleFunc 的函数如何访问 http.ResponseWriter 和 http.Request?

    func main http HandleFunc handler func handler w http ResponseWriter r http Request I never declared initialized or pass
  • PHP 中的 HTML DOM 操作

    我想知道如何使用 PHP 操作 DOM 树 我已经看到一些在 html 文件中加载 XML DOM 的答案 但如果我不需要加载怎么办 如果我想要操作的文档中有 XML DOM 脚本怎么办 我下面有一个打印出所有文件夹的示例 填写答案中的空白
  • 来自字节数组的 Crystal Report 图像无法打印

    我有一个带有类作为数据源的水晶报表 我有一个字节数组 我将位图传递给它 但它没有打印在水晶报表上 请参阅下面我的代码 var d new Label var eanCreator new CreateEan var bf new Binar
  • 取消搁置到另一个分支

    我正在尝试使用 TFS Power Tools 将更改解压到另一个分支 我正在尝试执行命令 tfpt unshelve migrate NuGet Build source ProjectName Main Source target Pr
  • 了解 Python HTTP 流

    我正在努力使用 Python 和请求访问流 API API 内容 我们启用了一个流端点 以便利用持久的 HTTP 套接字连接来请求报价和交易数据 来自 API 的流数据包括发出经过身份验证的 HTTP 请求并保持 HTTP 套接字打开以持续
  • 下一个和上一个按钮不起作用

    这是我的线性布局
  • 在 C 客户端服务器应用程序中,socket() 返回 0

    我正在开发一个应用程序 其中包含多个服务器套接字 每个服务器套接字都在唯一的线程中运行 外部实用程序 脚本 由线程之一调用 该脚本调用一个实用程序 客户端 该实用程序将消息发送到服务器套接字之一 最初 我使用的是system 来执行这个外部