小编Pra*_*abu的帖子

OpenSSL客户端证书与服务器证书

我对证书有一些基本问题.首先让我解释一下我对SSL身份验证的理解.

SSL/TLS基本上有两个主要的东西,

  1. 身份验证 - 确保我们正在与两端的正确方进行通信.
  2. 加密 - 加密两端之间传输的实际数据.

证书具有公钥和一些其他信息.客户端(比如"C")和服务器(比如"S")之间的SSL通信就像这样,

  1. C向S发起请求
  2. S将其公钥发送给C.
  3. C验证S的身份(服务器身份验证或服务器身份验证)
  4. C将其公钥发送给S.
  5. S验证C的身份.(客户身份验证或客户端身份验证)
  6. C生成对称或会话密钥(比如'K')并使用S公钥对其进行加密并将其发送到服务器.
  7. 现在C和S都有共享的对称密钥,用于加密数据.

在这里,我认为客户端身份验证的步骤4和5是可选的.纠正我如果我错了.

步骤1到5涉及非对称加密模式,即仅用于"验证",之后它涉及对称的加密模式,以实现它们之间的实际数据传输.

我的问题如下,

  1. 我从这个链接(与IIS服务器相关)中读到有两种类型的证书.一个是客户端证书,另一个是服务器证书.我认为客户端发起请求的是客户端证书,另一个是服务器证书.客户端和服务器证书与OpenSSL有什么区别?这些证书中的CN名称与OpenSSL有什么区别吗?

  2. 我被要求使用客户端证书进行身份验证.这是否意味着我们绕过服务器身份验证并仅使用客户端证书进行身份验证?我不这么认为.根据我的理解,除了服务器身份验证之外,还应该进行客户端身份验证.如果我在这里错了,请纠正我.

encryption ssl openssl

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

将C编译的静态库链接到C++程序

我试图将一个静态库(用gcc编译)链接到一个c ++程序,我得到了'未定义的引用'.我在ubuntu 12.04服务器机器上使用了gcc和g ++版本4.6.3.例如,以下是factorial方法的简单库文件:

mylib.h

#ifndef __MYLIB_H_
#define __MYLIB_H_

int factorial(int n);

#endif
Run Code Online (Sandbox Code Playgroud)

mylib.c

#include "mylib.h"

int factorial(int n)
{
    return ((n>=1)?(n*factorial(n-1)):1);
}
Run Code Online (Sandbox Code Playgroud)

我使用gcc为这个mylib.c创建了对象:

gcc -o mylib.o -c mylib.c
Run Code Online (Sandbox Code Playgroud)

同样,静态库是使用AR实用程序从目标文件创建的:

ar -cvq libfact.a mylib.o
Run Code Online (Sandbox Code Playgroud)

我用C程序(test.c)和C++程序(test.cpp)测试了这个库

C和C++程序都有相同的主体:

#include "mylib.h"
int main()
{
    int fact = factorial(5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

假设在/ home/test目录中有静态库libfact.a,我编译了我的C程序没有任何问题:

gcc test.c -L/home/test -lfact
Run Code Online (Sandbox Code Playgroud)

但是在测试C++程序时,它引发了一个链接错误:

g++ test.cpp -L/home/test -lfact

test.cpp:(.text+0x2f): undefined reference to `factorial(int)'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我甚至尝试在test.cpp中添加extern命令:

extern int factorial(int n) //added just before the main …
Run Code Online (Sandbox Code Playgroud)

c c++ linux gcc g++

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

增加TCP窗口大小

我对应用程序中增加TCP窗口大小有一些疑问.在我的C++软件应用程序中,我们使用TCP/IP阻塞套接字从客户端向服务器发送大小约为1k的数据包.最近我遇到了这个概念TCP窗口大小.所以我尝试使用setsockopt()for SO_SNDBUF和for 将值增加到64K SO_RCVBUF.增加此值后,我在WAN连接的性能方面有所改进,但在LAN连接方面却没有.

根据我对TCP窗口大小的理解,

客户端将数据包发送到服务器.在达到此TCP窗口大小时,它将等待确保从服务器接收到窗口大小中第一个数据包的ACK.在WAN连接的情况下,由于RTT的延迟大约100ms,ACK从服务器延迟到客户端.因此,在这种情况下,增加TCP窗口大小可以补偿ACK等待时间,从而提高性能.

我想了解我的应用程序中性能如何提高.

在我的应用程序中,即使使用setsockopt套接字级别增加TCP窗口大小(发送和接收缓冲区),我们仍然保持相同的数据包大小1k(即我们在单个套接字发送中从客户端发送到服务器的字节).我们还禁用了Nagle算法(内置选项将小数据包合并到一个大数据包中,从而避免频繁的套接字调用).

我的怀疑如下:

  1. 由于我使用阻塞套接字,对于每个1k的数据包发送,如果ACK不是来自服务器,它应该阻止.那么仅在WAN连接中改进TCP窗口大小后,性能如何提高?如果我误解了TCP窗口大小的概念,请纠正我.

  2. 为了发送64K数据,我相信我仍然需要调用套接字发送功能64次(因为我通过阻塞套接字发送每次发送1k),即使我将TCP窗口大小增加到64K.请确认一下.

  3. 使用RFC 1323算法启用Windows缩放时,TCP窗口大小的最大限制是多少?

我的英语不太好.如果您无法理解上述任何内容,请告诉我.

c++ sockets tcp

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

adb安装失败,错误为"INSTALL_FAILED_INSUFFICIENT_STORAGE"

我已经购买了我的第一部Android手机索尼Xperia M而没有意识到我们无法将应用程序移动到外部SD卡的问题.有关详情,请参阅此链接.

索尼的唯一建议是根据设备,分区并使用第三方应用来移动设备.他们还提到生根可能会使保修失效.

我的Android Xperia M详细信息如下所列

Model number C1904
Android version 4.1.2
Build number 15.1.C.2.8
Run Code Online (Sandbox Code Playgroud)

我试过从一些论坛运行以下命令,它对我不起作用,

adb devices
adb shell pm get-install-location
adb shell pm set-install-location 2
Run Code Online (Sandbox Code Playgroud)

虽然上面的命令没有提示任何错误,但我可以将安装位置设置为2(使用adb shell pm get-install-location).所以我相信它设置得当.但后来我尝试安装一些应用程序,它只安装在内部存储器中.

我试过' apps2sd '实用程序移动我的应用程序,它显示以下错误,

'The device does not have a real primary external storage, or the primary external storage is emulated. Moving app to SD function cannot be supported by this device.'
Run Code Online (Sandbox Code Playgroud)

最后来自另一个论坛,我了解到我们可以通过'adb install'命令安装apk文件直接安装到sd卡中,如下所示,

adb install -s C:\com.furkan0gul.mvanparking.apk
Run Code Online (Sandbox Code Playgroud)

上面的命令失败,出现此错误,

3531 KB/s (13523837 bytes in 3.740s)
        pkg: /sdcard/tmp/com.furkan0gul.mvanparking.apk
Failure …
Run Code Online (Sandbox Code Playgroud)

linux android adb android-sdk-tools sony-xperia

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

使用C/C++进行字符串格式化

最近我在接受采访时被要求将字符串"aabbbccccddddd"转换为"a2b3c4d5".目标是用一次出现和重复计数替换每个重复的字符.这里'a'在输入中重复两次,因此我们必须在输出中将其写为'a2'.另外,我需要编写一个函数来将格式反转回原始格式(例如从字符串"a2b3c4d5"到"aabbbccccddddd").我可以自由使用C或C++.我写了下面的代码,但面试官似乎对此不太满意.他让我尝试一种比这更聪明的方法.

在下面的代码中,我曾经formatstring()通过添加重复计数来消除重复的字符,并用于reverseformatstring()转换回原始字符串.

void formatstring(char* target, const char* source) {
  int charRepeatCount = 1;
  bool isFirstChar = true;
  while (*source != '\0') {
    if (isFirstChar) {
      // Always add the first character to the target
      isFirstChar = false;
      *target = *source;
      source++; target++;
    } else {
      // Compare the current char with previous one,
      // increment repeat count
      if (*source == *(source-1)) {
        charRepeatCount++;
        source++;
      } else {
        if (charRepeatCount > 1) {
          // Convert …
Run Code Online (Sandbox Code Playgroud)

c c++ visual-c++

5
推荐指数
4
解决办法
632
查看次数

在C ++中插入嵌套地图

假设我有一个指针类型的嵌套映射。然后有一行语句要插入到嵌套地图中,

map<int, map<int, int> >* nestedMap;
Run Code Online (Sandbox Code Playgroud)

目前,我分两个步骤进行操作。首先创建内部地图,然后如下所示插入外部地图,

nestedMap->insert(make_pair(int, map<int, int>)(int, innermap));
Run Code Online (Sandbox Code Playgroud)

如果地图不是指针类型,那么我可以像这样轻松插入,

nestedMap[int][int] = int;
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以插入类型指针的嵌套映射中?

谢谢普拉布

c++

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

C++虚拟调用实现需要澄清

我对虚函数有一些疑问,或者我们可以说运行时多态性.据我说,我假设它的工作方式如下,

  1. 将为每个具有至少一个虚拟成员函数的类创建虚拟表(V表).我相信这是静态表,因此它是为每个类创建的,而不是为每个对象创建的.如果我错了,请在此纠正我.

  2. 该V表具有虚函数的地址.如果该类有4个虚函数,那么该表有4个条目指向相应的4个函数.

  3. 编译器将添加一个虚拟指针(V-Ptr)作为该类的隐藏成员.该虚拟指针将指向虚拟表中的起始地址.

假设我有这样的程序,

class Base
{
    virtual void F1();
    virtual void F2();
    virtual void F3();
    virtual void F4();
}
class Der1 : public Base  //Overrides only first 2 functions of Base class
{
    void F1(); //Overrides Base::F1()
    void F2(); //Overrides Base::F2()
}
class Der2 : public Base  //Overrides remaining functions of Base class
{
    void F3(); //Overrides Base::F3()
    void F4(); //Overrides Base::F4()
}
int main()
{
    Base* p1 = new Der1; //Believe Vtable will populated in compile time …
Run Code Online (Sandbox Code Playgroud)

c++ oop

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

如何在Linux中检测unicode文件名

我有一个用C++编写的Windows应用程序.在这里我们用来检查文件名是unicode还是不使用wcstombs()函数.如果转换失败,我们假设它是unicode文件名.同样,当我在Linux中尝试相同时,转换不会失败.我知道在Windows中,默认的字符集是LATIN,而Linux的默认字符集是UTF8.根据文件名是否为unicode,我们有不同的编码集.由于我无法在Linux中弄清楚,我无法使我的应用程序可移植到Unicode字符.有没有其他的工作或我做错了什么?

c++ unicode

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

运行shell脚本的不同方式之间的区别

最近我被问到一个问题.执行shell脚本的不同方法有哪些?每种方法有什么区别?

我说我们可以在以下方法中运行shell脚本,假设test.sh是脚本名称,

  1. sh test.sh
  2. ./test.sh
  3. ../test.sh

我不知道1和2之间的区别.但通常在前2个方法中,执行时,它会产生新的进程并运行相同的.而在最后一种方法中,它不会产生新的进程.相反,它运行在同一个.

如果我错了,有人可以对此提出更多见解并纠正我吗?

unix linux

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

标签 统计

c++ ×6

linux ×3

c ×2

adb ×1

android ×1

android-sdk-tools ×1

encryption ×1

g++ ×1

gcc ×1

oop ×1

openssl ×1

sockets ×1

sony-xperia ×1

ssl ×1

tcp ×1

unicode ×1

unix ×1

visual-c++ ×1