我希望我的Java代码在一个密钥库中搜索服务器的CA证书...如果它无法找到特定的证书(我认为只有当我尝试通过LDAP连接到Directory Server时才会知道),它应该是在另一个密钥库中查找证书,我知道它的路径.
我试过这个:
System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts" + System.getProperty("path.separator") + path/to/second/keystore);
但它似乎没有用.
只添加一个路径(其中任何一个)都可以工作,即如果找到证书则会像魅力一样运行,否则就会失败.
所以我的问题是:
是否有方法将多堆密钥库路径添加到javax.net.ssl.trustStore?
如果不可能我应该如何编写我的代码(我要求算法),以便它在第一次搜索后不会抛出异常而失败?
PS:我对Java不太熟悉.
以下是我的代码的相关部分:
if(useSSL)
{
try
{
SSLContext se = SSLContext.getInstance("TLS");
Security.addProvider(se.getProvider());
}
catch(NoSuchAlgorithmException e) { }
System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts");
com.org.ldap.LDAPSocketFactory ssf = new LDAPJSSESecureSocketFactory();
LDAPConnection.setSocketFactory(ssf);
}
try
{
lc = new LDAPConnection();
lc.connect( ldapServer, ldapPort);
lc.bind( ldapVersion, ldapUser, (userInfo[1]).getBytes() );
}
catch (LDAPException le)
{
le.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud) 例:
struct dummy
{
int var;
};
Run Code Online (Sandbox Code Playgroud)
为什么使用这样的结构?大多数情况下,我在一些头文件中看到过它们.
的atomic_t类型也被定义这样的.不能简单地定义使用:
typedef int atomic_t;
Run Code Online (Sandbox Code Playgroud) 我用C 编写了一个多线程服务器程序,它回显客户端发送的所有数据.
最初,我poll()在我的程序中使用函数来检测POLLRDHUP事件,为此我定义了_GNU_SOURCE宏(这里定义了此事件).
后来我更新了我的代码和删除的poll()功能,但我忘了删除_GNU_SOURCE宏.
现在我的代码终于完成了(有点长,发布超过250行).在删除宏之前,我正在编译我的程序:
gcc multi_thread_socket_v4.c -Wall -Werror -g -lpthread -o multi_thread_socket
Run Code Online (Sandbox Code Playgroud)
它工作正常:没有错误,没有警告
删除宏定义并使用相同的命令行编译后,gcc的输出为:
multi_thread_socket_v4.c: In function ‘main’:
multi_thread_socket_v4.c:194: warning: implicit declaration of function ‘pthread_mutexattr_settype’
multi_thread_socket_v4.c:194: error: ‘PTHREAD_MUTEX_ERRORCHECK’ undeclared (first use in this function)
multi_thread_socket_v4.c:194: error: (Each undeclared identifier is reported only once
multi_thread_socket_v4.c:194: error: for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)
我已经包含了所有必需的库,因为它最初工作正常.
我偷看成pthread.h的/usr/include/pthread.h,发现了这一点:
/* Mutex types. …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,其中大多数使用过的库函数在出错时返回-1并设置errno.程序的行为是这样的,如果发生错误它将退出.要确定确切的退出点和程序外部的错误(使用示例gdb),我想使用以下方法:
err = func_1(..arglist_1..);
if(err != 0)
{
perror("func(..arglist..)");
return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
perror("func(..arglist_n..)");
return (((unsigned)n << 8) | errno);
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是安全的假设.
现实: 错误号被声明为extern int errno;内部errno.h
假设1:价值错误号总是小于255
假设2: 错误号总是正的.
根据定义的所有误差常数(EAGAIN等)errno.h,这些假设目前都是正确的.这些可以假设在未来也是如此吗?
PS:我不想依赖于perror()确定退出点.
我poll()在我的程序中使用函数,我读了这个链接,使用POLLRDHUP标志你必须_GNU_SOURCE在所有头文件包含之前定义.我需要这个标志,以便轮询套接字可以告诉我客户端是否挂起,以便我可以终止相应的线程.
顺便说一句,我正在编写一个可以同时处理多个客户端的'echo'服务器的C程序,我在OpenSuse Linux Enterprise Server 10.3(x86_64)上使用GCC 4.1.2.
我有这个代码:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p1_arr = arr;
int (*p2_arr)[10] = arr; // Line 7, Shows Warning here
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译gcc使用时gcc -g -Wall LengthofArray.c,它显示以下警告:
gcc: LengthOfArray.c:7: [Warning] assignment from incompatible
pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)
我的问题是if int (*p2_arr)[10]是一个指向大小为10的数组的指针,那么为什么编译器显示这个警告?
那么正确的方法是什么呢?
我在Windows 7 32位(DevC++)上使用了gcc 4.7.2,
并在SLES 10.3 x86_64上检查了gcc 4.1.2
我的BeagleBoard上装有Angstrom Linux。
我想实现一个非常精确的计时器,它可以每500us触发一次。我读到有关hrtimers,但发现的所有实现都是针对内核空间的。我想在用户空间中实现它。
有没有可以调用这些API的API hrtimers,我可以在用户空间中使用它,或者以其他方式在Linux中实现准确的计时器?
我已将其设置jiffy为几纳秒。
我发现一个makefile 这里一边念叨自动工具.
我从来没有使用像这样的makefile,我自己尝试过.
我写的makefile的内容是:
all: HelloWorld
clean:
rm -f HelloWorld *.o
Run Code Online (Sandbox Code Playgroud)
包含makefile的文件夹只包含一个文件HelloWorld.c.
make以下输出成功运行:
$> make
cc HelloWorld.c -o HelloWorld
Run Code Online (Sandbox Code Playgroud)
现在,我想尝试,并在makefile我改名为目标all来HelloWorl.这次make失败并出现以下错误:
$> make
make: *** No rule to make target `HelloWorl', needed by `all'. Stop.
Run Code Online (Sandbox Code Playgroud)
请解释make自动搜索和编译源的这种行为.
我的理解是它通过附加.c并使用默认cc编译器编译来从目标名称创建源名称.
在研究一些代码时,我遇到了以下结构:
/* PACKET format:
*
* clientRandom - 20 byte buffer
* yLen - 4 bytes (LoHi integer)
* yData - yLen byte buffer
*
* Total length = 24 + yLen bytes
*/
typedef struct packetFormat
{
char clientRandom[20];
uint32 yLen;
char yData[1];
}packetFormat;
Run Code Online (Sandbox Code Playgroud)
为什么第三个字段没有声明为char *yData可变长度的char缓冲区?
最近我经历了一些类似的代码:(代码是专有的,因此添加了类似的代码)
#include<stdio.h>
void test_it(var)
{
printf("%d\n",var);
}
int main()
{
test_it(67);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
test_it没有提到数据类型的参数.
我编译为gcc test_it.c......:令人惊讶的没有警告/错误
我再次编译使用:gcc -Wall test_it.c...:再次没有警告/错误
(现在变得更具侵略性......)
我使用以下方法再次编译它:gcc -Wall -Wextra test_it.c...:
warning: type of ‘var’ defaults to ‘int’最后我得到了警告.
我尝试使用多个参数:
void test_it(var1, var2)
{
printf("%d\n%d\n",var1, var2);
}
int main()
{
test_it(67,76);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
同样的行为!!
我也试过这个:
void test_it(var)
{
printf("%d\n",var);
}
main() // Notice that no `int` there
{
test_it(67);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码-Wall仅提供选项警告.
所以我的问题是为什么 …
我用这个命令来编译我的程序:
gcc -g -Wall -Werror -lpthread multi_thread_server.c -o multi_thread_socket_v4
它给出了undefined reference to <function_name>错误.
经过大量的试验和错误修复错误后,我(错误地)将选项重新排列gcc为:
gcc multi_thread_server.c -lpthread -Wall -Werror -o multi_thread_server -g
它起作用了.
在这里,我想知道,是否有用于选项序列的规则gcc?
PS:我知道有无限的选择gcc,我想知道根据选项类别的顺序.
我在读Beej的fork()底漆,当我打电话pid = fork();,父进程得到子进程的PID,而孩子的过程中pid = 0.
现在,因为子进程开始执行代码的一部分后的fork()声明,请问pid获得价值0?