小编jfl*_*fly的帖子

SSL_CTX_use_PrivateKey_file()失败

我正在Windows上编写一个客户端应用程序,它建立与服务器的SSL连接,服务器请求客户端证书进行身份验证.服务器提供了一个.pfx文件,然后我使用openssl命令行工具来获取证书和私钥,如下所示:

openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in filename.pfx -nocerts -out key.pem
Run Code Online (Sandbox Code Playgroud)

在那之后,我尝试加载证书,并与OpenSSL的功能如下私钥,但是SSL_CTX_use_PrivateKey_file()总是失败,错误消息" error:0906D06C:PEM routines:PEM_read_bio:no start line",我弄不明白,为什么,任何人都可以给我一些启示?这是代码.

#include "openssl/ssl.h"
#include "openssl/err.h"
#include <stdio.h>
#include <string>

int InitClientCtx()
{
    OpenSSL_add_ssl_algorithms();

    SSL_CTX* m_pClientCtx;
    m_pClientCtx = SSL_CTX_new(SSLv23_method());

    if(!m_pClientCtx)
    {
        return -1;
    }

    ::SSL_CTX_set_options(m_pClientCtx, SSL_OP_ALL);  //for well-known bugs

    int nRet = 0;

    std::string sCertFilePath = "C:\\cert.pem";

    nRet = SSL_CTX_use_certificate_chain_file(m_pClientCtx, sCertFilePath.c_str());

    std::string sKeyPassWord = "123456";

    SSL_CTX_set_default_passwd_cb_userdata(m_pClientCtx, (void*)(sKeyPassWord.c_str()));

    std::string sKeyFilePath = "C:\\key.pem";

    // this method returned 0, which means …
Run Code Online (Sandbox Code Playgroud)

c++ ssl openssl

10
推荐指数
3
解决办法
3万
查看次数

有什么方法可以改变同步Windows API SendARP的行为?

我正在Windows上编写本地网络扫描程序,以查找具有IP帮助程序功能的在线主机,这相当于nmap -PR没有WinPcap.我知道如果远程主机没有响应,SendARP将阻塞并发送arp请求3次,所以我用std::aync它为每个主机创建一个线程,但问题是我想每20ms发送一个ARP请求所以它不会太多在很短的时间内很多arp数据包.

#include <iostream>
#include <future>
#include <vector>

#include <winsock2.h>
#include <iphlpapi.h>


#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main(int argc, char **argv)
{
    ULONG MacAddr[2];       /* for 6-byte hardware addresses */
    ULONG PhysAddrLen = 6;  /* default to length of six bytes */
    memset(&MacAddr, 0xff, sizeof (MacAddr));
    PhysAddrLen = 6;

    IPAddr SrcIp = 0;
    IPAddr DestIp = 0;

    char buf[64] = {0};

    size_t start = time(NULL);

    std::vector<std::future<DWORD> > vResults;

    for …
Run Code Online (Sandbox Code Playgroud)

c++ winapi multithreading asynchronous arp

10
推荐指数
1
解决办法
418
查看次数

什么是iPhone/Android响应ARP请求的策略

当我arping用来发送ARP请求(我知道睡觉的iPhone没有回复ICMP ping)来睡觉的iPhone/Androids(意味着它们打开但是屏幕很暗)连接在同一个wifi上时,iPhone回复给我这样的:

ARPING 10.109.201.139
Timeout
Timeout
Timeout
42 bytes from e0:ac:cb:b0:22:5b (10.109.201.139): index=0 time=20.201 msec
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
42 bytes from e0:ac:cb:b0:22:5b (10.109.201.139): index=1 time=65.401 msec
Timeout
Run Code Online (Sandbox Code Playgroud)

但有时,iPhone会不断回复.有时它根本不回答arping.Android答案如下:

ARPING 10.109.201.119
Timeout
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=0 time=78.345 msec
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=1 time=148.228 msec
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=2 time=217.777 msec
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=3 time=84.933 msec
Timeout
42 bytes from c0:ee:fb:01:f4:fd (10.109.201.119): index=4 time=174.140 …
Run Code Online (Sandbox Code Playgroud)

networking ethernet ping arp libpcap

8
推荐指数
1
解决办法
834
查看次数

一个函数而不是复制和粘贴编程

我有一个对象,这个对象中的每个成员变量都有一个名称,我可以通过调用get_name()获取它,我想要做的是按字母顺序连接成员变量的所有名称,然后做一些事情.例如:

class CXMLWrapper<class T>
{
public:
    CXMLWrapper(const char* p_name) : m_local_name(p_name)
    {
    }
    //skip the get_name(), set_name() and others    
private:
    string m_local_name;
    T m_type_var;
}
class object
{
public:
    object() : m_team("team"), m_base("base")
    {
    }
public:
    CXMLWrapper<string> m_team;
    CXMLWrapper<string> m_base;
...
}
Run Code Online (Sandbox Code Playgroud)

我必须像这样硬编码:

object o;
string sign = o.m_base.get_name();
sign += o.m_team.get_name();
Run Code Online (Sandbox Code Playgroud)

我需要一个函数来执行此操作,而不是在对象变化时复制和粘贴.有人有想法吗?

c++

7
推荐指数
1
解决办法
780
查看次数

什么是客户端证书以及从哪里获取它,如何使用它连接到服务器?

我正在用 C++ 编写一个客户端应用程序,以通过 https 从服务器检索一些信息,但服务器请求客户端证书进行身份验证,我知道服务器证书在通过 https 浏览网页期间是如何工作的:公共证书提供给任何网页浏览器附带一个广泛的内置可信根证书列表,这些证书连接到网站并向 Web 浏览器证明提供商认为它已向网站所有者颁发了证书,但我不清楚客户端证书。

我用谷歌搜索了很多,但仍然很困惑。谁能给我解释一下?我在哪里可以获得客户端证书?从服务器?我知道我可以通过调用来加载证书文件,如果我有客户端证书和客户端私钥,我可以SSL_CTX_use_certificate_chain_file()通过调用SSL_CTX_use_PrivateKey_fileopenssl 来加载私钥。

c++ openssl ssl-certificate

7
推荐指数
1
解决办法
6251
查看次数

C随机主元快速排序(改进配分函数)

我是一名计算机科学专业的学生(刚刚开始),我正在努力从伪代码编写快速排序的随机枢轴版本。我已经编写并测试了它,但一切都很完美......

分区部分看起来有点太复杂了,感觉漏掉了什么或者想太多了。我不明白这是否可以,或者我是否犯了一些可以避免的错误。

长话短说:它确实有效,但如何做得更好呢?

预先感谢您的所有帮助

void partition(int a[],int start,int end)
{
    srand (time(NULL));
    int pivotpos = 3;   //start + rand() % (end-start);
    int i = start;    // index 1
    int j = end;      // index 2
    int flag = 1;
    int pivot = a[pivotpos];   // sets the pivot's value
    while(i<j && flag)      // main loop
    {
        flag = 0;
        while (a[i]<pivot)
        {
            i++;
        }
        while (a[j]>pivot)
        {
            j--;
        }
        if(a[i]>a[j]) // swap && sets new pivot, and restores the flag
        { …
Run Code Online (Sandbox Code Playgroud)

c arrays quicksort partition

5
推荐指数
1
解决办法
2万
查看次数

使用bytes.Buffer与使用*bytes.NewBuffer时json.Unmarshal的区别

我在查看bytes包.如果我使用bytes.Buffer定义一个缓冲区,那么下面的代码工作,我得到一个输出.但是,如果我尝试创建具有一定容量的缓冲区,然后尝试相同的代码,则会失败,并显示错误错误:无效字符'\ x00'正在查找值的开头.不知道如何解决它.

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
)

func main() {
    var jsonBlob = []byte(`[
        {"Name": "Platypus", "Order": "Monotremata"},
            {"Name": "Quoll",    "Order": "Dasyuromorphia"}
            ]`)

    //var b bytes.Buffer
    b := *bytes.NewBuffer(make([]byte, 20))
    b.Write(jsonBlob)

    fmt.Println(b.String())

    var dat interface{}
    err := json.Unmarshal(b.Bytes(), &dat)
    if err != nil {
        fmt.Println("error:", err)
    }   
    fmt.Printf("%+v", dat)
}
Run Code Online (Sandbox Code Playgroud)

使用bytes.Buffer输出Run

[
        {"Name": "Platypus", "Order": "Monotremata"},
        {"Name": "Quoll",    "Order": "Dasyuromorphia"}
    ]
[map[Name:Platypus Order:Monotremata] map[Name:Quoll Order:Dasyuromorphia]]
Program exited.
Run Code Online (Sandbox Code Playgroud)

使用bytes.NewBuffer运行输出

[
        {"Name": "Platypus", "Order": "Monotremata"},
        {"Name": "Quoll",    "Order": "Dasyuromorphia"} …
Run Code Online (Sandbox Code Playgroud)

go

4
推荐指数
1
解决办法
2290
查看次数

如何解释运算符重载中的"operator const char*()"?

我正在查看String类的一个实现,并注意到以下重载的==运算符.

String f = "something";
String g = "somethingelse";
if (f == g)
    cout << "Strings are equal." << endl;

bool operator==(String sString)
{
    return strcmp(operator const char*(), (const char*)sString) == 0; 
}
Run Code Online (Sandbox Code Playgroud)

除了operator const char*()它用于什么之外,我理解了大部分内容?我对运算符重载有非常基本的了解,有人可以请多说一点吗?

c++ operator-overloading

3
推荐指数
2
解决办法
1万
查看次数

查找给定字符串中所有子字符串的出现次数

我使用一个简单的字符串函数strstr来查找文本中第一次出现刺痛.我使用以下代码来计算文本中唯一单词的数量.

for(int i=0;i<24;i++)
      {
              if(strstr(text,ops[i]))
              {                
                      op++;
              }

      }
Run Code Online (Sandbox Code Playgroud)

但我想找到程序中所有子字符串的出现.我可以在JAVA中轻松完成.但我被要求用C++做这件事.有帮助吗?

c++ string

3
推荐指数
1
解决办法
2万
查看次数

读取数据并使用scanf跳过括号

我编写了一个C程序来从std输入中选择数据,该数据从一个数字开始,表示数据集的数量,然后有N对数据,形式为:(xy),所以我把代码编写为下面:

#include <stdio.h>

int main()
{
    int n_sets;
    scanf("%d", &n_sets);
    int i;
    for(i = 0; i < n_sets; ++i)
    {
        int m, n;
        scanf("(%d %d)", &m, &n);
        printf("%d\t%d\n", m, n);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.输入数据集后,程序直接打印未初始化的m&n.但是当我在之前添加一个空格时(%d %d),它运行正常.有人可以解释一下吗?

c scanf

2
推荐指数
1
解决办法
883
查看次数

PHP - 在foreach循环中取消设置数组元素

您好我试图使用foreach循环删除数组元素,但它什么也没做.我需要索引完全消失而不是使其为null.这是我尝试过的:

foreach ($_SESSION['cart']  as &$arrays3) {
    if($arrays3['id'] == $id){
        unset($arrays3);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,每个键的数组值包含一个关联数组.

php arrays foreach

2
推荐指数
1
解决办法
5537
查看次数