学习live555的点点滴滴(一)

    技术2025-04-26  6

    1.让系统自动分配可用端口给socket

    看到live555有一段关于socket 端口判断的代码:

    RTSPServer.cpp -- setUpOurSocket中的一个调用:

    if (ourPort.num() == 0) { // bind() will have chosen a port for us; return it also: if (!getSourcePort(env, ourSocket, ourPort)) break; }

    getSourcePort的具体实现在GroupsockHelper.cpp中,如下:

     

    static Boolean getSourcePort0(int socket, portNumBits& resultPortNum/*host order*/) { sockaddr_in test; test.sin_port = 0; SOCKLEN_T len = sizeof test; if (getsockname(socket, (struct sockaddr*)&test, &len) < 0) return False; resultPortNum = ntohs(test.sin_port); return True; } Boolean getSourcePort(UsageEnvironment& env, int socket, Port& port) { portNumBits portNum = 0; if (!getSourcePort0(socket, portNum) || portNum == 0) { // Hack - call bind(), then try again: MAKE_SOCKADDR_IN(name, INADDR_ANY, 0); bind(socket, (struct sockaddr*)&name, sizeof name); if (!getSourcePort0(socket, portNum) || portNum == 0) { socketErr(env, "getsockname() error: "); return False; } } port = Port(portNum); return True; }

     

    认真实践了下,原来是当端口号为0的时候就让系统自动分配一个端口给socket。

    实验代码如下:

    #include "stdafx.h" #include <WinSock2.h> #pragma comment(lib, "wsock32.lib") int _tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); //初始化 if ( err != 0 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL.*/ printf("init error./n"); return 1; } SOCKET socketf; int port1, len; socketf = socket(AF_INET, SOCK_STREAM, 0); //创建一个socket struct sockaddr_in test; test.sin_family = AF_INET; test.sin_addr.s_addr = htonl(INADDR_ANY); test.sin_port = 0; //这里一定要置0,在绑定中系统才会自动分配可用端口给socket len = sizeof test; bind(socketf, (struct sockaddr *)&test, sizeof test); //绑定socket与地址 getsockname(socketf, (struct sockaddr *) &test, &len); //获取系统分配的端口号 port1 = ntohs(test.sin_port); printf("new port = %d./n", port1); closesocket(socketf); getchar(); return 0; }

    感觉比较有用就记录下来了。

     

    最新回复(0)