在Linux中,我是否可以打开套接字并将套接字传递给另一个进程?如果是的话,你能告诉我在哪里可以找到一个例子吗?
谢谢.
假设我的C程序处理SIGUSR1.当它收到信号时,是否可以知道是谁发送的?IE中.得到那个过程的pid?
我有一个Linux程序分为两部分.
一部分执行NAT遍历以获得UDP套接字(UDP打孔)或TCP套接字(TCP打孔).第一部分用C语言编写,以允许本地功能,这些功能可以促进或增强NAT遍历过程.第二部分实际上使用通过第一部分中执行的NAT遍历获得的连接套接字.
现在这是问题所在.我希望第一部分,即获得套接字的部分,独立于第二部分,即使用套接字的部分用于特定应用目的.例如,我希望第一部分可以重用于各种不同的应用程序,这些应用程序都需要在对等体之间建立的UDP和TCP连接.
现在,我希望第二部分(应用程序部分)用Java而不是C或C++编写.我希望第二部分使用由负责NAT遍历的C代码获得的套接字连接.假设第一部分建立了一个连接,然后返回一个结构:
// Represents a TCP or UDP connection that was obtained in part one.
struct ConnectionObtained {
int socket_file_descriptor;
int source_port;
int destination_port;
int source_address; // 4 byte ipv4 address
int destination_address;
int is_UDP; // 1 for UDP client socket, 0 for TCP client socket
};
Run Code Online (Sandbox Code Playgroud)
第一部分中的C代码可以通过JNI(Java Native Interface)或通过进程间通信将此POD /结构提供给第二部分中的Java代码.
我希望Java代码使用该信息来构造一个声明类型为java.net.DatagramSocket或java.net.Socket的对象,然后在需要DatagramSocket或Socket的任何地方使用该对象.
作为起点,请考虑以下示例代码......
/**
* Determines the Unix file descriptor number of the given {@link ServerSocket}.
*/
private int getUnixFileDescriptor(ServerSocket ss) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Field …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚为什么mysql默认使用Unix套接字(/tmp/mysql.sock),而不是普通的TCP/IP套接字.
它似乎不是一个安全的东西,因为你只能在127.0.0.1上监听,它应该同样安全(套接字文件是世界可写的,因此你不能获得基于Unix帐户的保护).
当然,所有操作系统都依赖于高性能的TCP/IP,以至于它不会比Unix套接字慢得多 - 即使对于网络流量,Linux也会做各种零拷贝技巧,所以它肯定必须快速进行环回.
那么在这里使用Unix套接字有什么合理的理由,还是只是一些奇怪的历史事故?
我有两个prgrams让我们说prog1和prog2.我正在用prog1打开一个文件并对其进行一些操作.现在没有关闭prog1中的文件,我使用unix套接字将其文件描述符发送到prog2,然后在其中执行一些操作.
虽然我得到了我在prog1中传递的相同描述符,但是在prog2中收到的fd上执行fstat()会抛出错误,说明文件描述符错误.我已经在prog1中打开了具有corerct权限的文件,这些权限对所有人都是读写,但我仍然收到错误.
为什么会这样.如果我传递文件描述符的方式是错误的,那么请建议一个正确的方法.
我所拥有的是进程id和来自该进程的文件描述符.除了sendmsg之外还有什么办法可以复制(或重新打开)该进程的文件描述符以供Linux中的另一个进程使用吗?
Windows有DuplicateHandle用于此目的,我想知道Linux上是否有类似的东西.
int fd = socket(//arguments);
Run Code Online (Sandbox Code Playgroud)
这个描述符是否可以通过IPC传递给另一个进程并且仍然有效,或者它是创建它的进程的本地?