SIGPIPE,简单 OpenSSL Web 服务器中的破损管道

2024-01-19

我正在尝试编写一个使用 OpenSSL 的简单 Web 服务器。我不断收到“管道损坏”错误。即使当我处理错误时,套接字似乎也永远不会打开以进行写入。

我究竟做错了什么?

这是我的代码:

/*
 * I created tempory certificates like this:
 *
 * openssl req -newkey rsa:1024 -x509 -keyout key.pem -out root.pem
 *
 * I compile like this:
 *
 * gcc -g -o webssl webssl.c -lssl -lcrypto
 *
 * I get this error:
 *
 * Program received signal SIGPIPE, Broken pipe.
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

const char *password = "jake";
const char *KEY_FILE = "key.pem";
const char *CA_LIST = "root.pem";

const char *response = "HTTP/1.0 200 OK\r\nServer : webssl\r\n\r\n<html><head><title>Hello World!</title></head><body><h1>Hello world!</h1></body></html>";

void sigpipe_handle(int x)
{
    printf("broken pipe\n");
}


int password_cb(char *buf, int num, int rwflag, void *userdata)
{
    if(num<strlen(password)+1)
        return 0;
    strcpy(buf, password);
    return strlen(password);
}

int main(int argc, char *argv[])
{
    SSL *ssl = NULL;
    SSL_CTX *ctx = NULL;

    int listenfd, clientfd;
    struct sockaddr_in clientaddr;
    socklen_t addrlen;
    char *port = "8080";

    struct addrinfo hints, *res;

    char buffer[5000];

    SSL_library_init();

    /* Set up a SIGPIPE handler */
    signal(SIGPIPE,sigpipe_handle);

    ctx = SSL_CTX_new(SSLv23_server_method());
    SSL_CTX_use_certificate_chain_file(ctx, KEY_FILE);
    SSL_CTX_set_default_passwd_cb(ctx, password_cb);
    SSL_CTX_use_PrivateKey_file(ctx, KEY_FILE, SSL_FILETYPE_PEM);
    SSL_CTX_load_verify_locations(ctx, CA_LIST, 0);

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, port, &hints, &res);
    listenfd = socket(res->ai_family, res->ai_socktype, 0);
    bind(listenfd, res->ai_addr, res->ai_addrlen);
    freeaddrinfo(res);

    listen(listenfd, 15);

    while (1) {
        addrlen = sizeof(clientaddr);
        clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, &addrlen);

        ssl = SSL_new(ctx);
        SSL_set_fd(ssl, clientfd);
        SSL_accept(ssl);

        SSL_read(ssl, buffer, 5000);

        SSL_write(ssl, response, strlen(response));

        SSL_free(ssl);
        close(clientfd);
    }

    return 0;
}

你可以试试signal(SIGPIPE, SIG_IGN)。这应该使 send 返回 EPIPE 错误。否则你可以关注克雷克 SB https://stackoverflow.com/users/596781/kerrek-sb评论中的建议是向发送调用发送 MSG_NOSIGNAL 标志。

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

SIGPIPE,简单 OpenSSL Web 服务器中的破损管道 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐

  • 如何使用 PyQt5 在 qml 中设置值?

    我想从 PyQt5 将值写入 qml 该值动态变化 例如 矩形文本值是从 Pyqt5 归档的 Rectangle width 75 height 75 text values from PyQt5 如果你想从 python 修改 QML 属
  • jQuery 醉酒插件。对焦触发不起作用

    我一直在通过 jQuery 工具提示插件进行过滤 并发现有点醉意 它由 GitHub 使用 这是我大部分决定的基础 我真的很喜欢它 而且它真的很容易使用 但我有一个问题 我需要工具提示在焦点上淡入 而不是悬停 目前它可以工作 但只能在悬停时
  • primefaces selectonemenu 更改事件不适用于空值

    我有一个包含一些项目的选择菜单 还有一个空项目用于显示 请选择一个 我的目标是当我选择其中之一时查询一些数据 如果我选择 请选择一个 则做另一件事 但最终 更改事件会针对正常值被触发 但如果我选择 请选择一个 项目 则不会触发它 感谢您的帮
  • HTML 中的上标文本

    是否可以在值字段中使用上标文本
  • SVN Changelist 与 Git 等效吗?

    只是好奇 Git 是否有类似 Subversions Changelist 功能 我发现它在运行中使用非常方便 我知道我可以运行类似的东西 cat changelistfileimade xargs git update 但我很好奇是否也有
  • android 内存不足:没有更多的后台进程?需要帮忙

    我面临内存不足的问题 Low memory no more background process这是场景 我正在使用一个从字符串数组获取数据的列表 它有一个自定义背景 单击项目 列表会获取另一个字符串数组以显示为第二级或第三级 数据库中写入
  • 计算一组集合之间的相似度

    假设有4组 s1 1 2 3 4 s2 2 3 4 s3 2 3 4 5 s4 1 3 4 5 有没有一个标准的度量来表示这组4组的相似程度 感谢您对Jaccard方法的建议 然而 这似乎是成对的 如何计算整组集合的相似度 成对地 你可以计
  • Oracle 11 - sqlplus - 出错时回滚整个脚本 - 如何?

    如何使 Oracle 11g 在包含的 SQL 文件中出现任何错误时回滚整个事务 文件内容是 set autocommit off whenever SQLERROR EXIT ROLLBACK insert into a values 1
  • 严格来说,作用域分配 <<- 分配给父环境还是全局环境?

    往往是父母的环境is全球环境 但有时并非如此 例如在函数内的函数中 或者在错误函数中tryCatch 严格来说 确实 lt lt 分配给全局环境 还是简单地分配给父环境 试试看 env new env env2 new env parent
  • Glibc - ucontext.h 中出现错误,但仅适用于 -std=c11

    我有这个最小的 helloworld 扩展包括ucontext h include
  • 在 SQL 中对两个字段使用 group by 并进行计数

    我的 mysql 数据库中有一个表 其中有两列 组和子组 见下文 group subGroup grp A sub A grp A sub A grp A sub B grp B sub A grp B sub B grp B sub B
  • Clang Const 限定的 C++ 方法

    我如何测试 C 方法在 clang 中是否是 const 限定的 例如 class Inner public int i Inner float inner method const 我正在使用 clang c 库 并且尝试使用clang
  • 将对象从视图传递到控制器

    有没有办法将对象 特别是视图中使用的 form builder 对象 传递给控制器 中的操作 我正在使用 link to remote 并希望更新控制器中的变量 然后通过 render update 块将新的嵌套表单元素添加到我的表单中 如
  • Java多线程访问静态变量

    如何同时从多个线程访问静态变量 如果我有一个像这样的课程 Class A public static boolean FLG false 我需要像这样访问线程 1 中的值 public void run boolean t1 A FLG 从
  • 旋转并重命名 Pandas 数据框

    我有一个格式为的数据框 Date Datediff Cumulative sum 01 January 2019 1 5 02 January 2019 1 7 02 January 2019 2 15 01 January 2019 2
  • less 循环中的空间

    我有这个 loop index when index lt to page index nav ul li nth child index background fff loop index 1 似乎有问题 因为我的 css 输出是 ul
  • Keras 加载彩色图像

    我有 3 个带有彩色图像的文件夹 文件夹的名称是里面图像的标签 cls1 img 0 png img n png cls2 img 0 png img n png cls3 img 0 png img n png 我想使用 Keras 库创
  • 以编程方式发送短信未存储在发件箱中?

    我正在以编程方式制作一个项目短信 我使用此代码发送短信 SmsManager sms SmsManager getDefault sms sendTextMessage phoneNumber null message sentPI del
  • 为什么使用“envsubst file”重写文件会将其留空? [复制]

    这个问题在这里已经有答案了 我需要将一些环境变量值放入文件中 cat file VAR echo VAR text 当我做envsubst VAR VAR lt file gt file文件变空 为了解决这个问题我使用envsubst VA
  • SIGPIPE,简单 OpenSSL Web 服务器中的破损管道

    我正在尝试编写一个使用 OpenSSL 的简单 Web 服务器 我不断收到 管道损坏 错误 即使当我处理错误时 套接字似乎也永远不会打开以进行写入 我究竟做错了什么 这是我的代码 I created tempory certificates