我的程序作为客户端的一些外部服务。我希望通过我的程序使用本地端口。当我处理套接字时,这不是问题,那么我可能会用这种方式:
但是我无法处理套接字,因为套接字是在某个公司提供的共享库中的某个地方创建的(我没有源* .so)。我只能使用随机端口创建与某些服务的连接,并且只使用此服务的功能。 因此,当我创建连接时,我不知道哪个端口选择系统,但在我的程序之后我会知道。
#include "somesharedlibrary.h"
int main(int argc, char *argv[])
{
// some uid , 0 means choose random port (must be), user, password
int i = CreateConnectionToSecretService("38324f42" , 0 , "admin" , "admin");
if (i != 0){
printf("Ok I have connection from service");
// Now I have connection let's say on 0.0.0.0.:1234
// I know that using netstat- antl, but of course
// I don't know that in code. Therefore my question for You.
// It is posible get local port which was used by system in this place ?
}else{
printf("something is wrong by.. by..")
}
return 0;
}
解决
经过长时间的讨论后,正如所说 SergeyA :)。当我的程序连接到服务时创建了2个新的文件描述符:用于UDP和TCP连接。对于TCP是描述符nr 4.然后应该写下面的代码:struct sockaddr_in foo;
socklen_t len = sizeof foo;
int f = getsockname(4, (struct sockaddr *)&foo, &len );
printf( "%s", inet_ntoa( foo.sin_addr));
由于
答案 0 :(得分:4)
既然你提到.so,我认为它是* Nix变体的一部分。因为它是* nix,这意味着它是Linux:)
这样做很容易。只需在调用create connection之前获取进程文件描述符的快照 - 例如,通过读取/ proc // fd - 而不是在调用connection之后。您看到的额外描述符将打开一个新的套接字(如果有多个,这意味着,库打开了多个描述符 - 您将不得不猜测哪个是您需要的。)现在您有了描述符和你可以询问它。