如何让本地端口不知道套接字

时间:2015-11-17 13:38:52

标签: c++ sockets

我的程序作为客户端的一些外部服务。我希望通过我的程序使用本地端口。当我处理套接字时,这不是问题,那么我可能会用这种方式:

Get Local Port used by Socket

但是我无法处理套接字,因为套接字是在某个公司提供的共享库中的某个地方创建的(我没有源* .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));

由于

1 个答案:

答案 0 :(得分:4)

既然你提到.so,我认为它是* Nix变体的一部分。因为它是* nix,这意味着它是Linux:)

这样做很容易。只需在调用create connection之前获取进程文件描述符的快照 - 例如,通过读取/ proc // fd - 而不是在调用connection之后。您看到的额外描述符将打开一个新的套接字(如果有多个,这意味着,库打开了多个描述符 - 您将不得不猜测哪个是您需要的。)现在您有了描述符和你可以询问它。