最近经常测试流媒体的传输,要监听某个端口看流是否引入了,每次打开wireshark太麻烦了,就写了简单的小工具,监听某个端口是否来数据了:
std::string GetLocalIpAddress()
{
WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData) != 0)
return "";
char local[255] = {0};
gethostname(local, sizeof(local));
hostent* ph = gethostbyname(local);
if (ph == NULL)
return "";
in_addr addr;
memcpy(&addr, ph->h_addr_list[0], sizeof(in_addr)); // 这里仅获取第一个ip;
std::string localIP;
localIP.assign(inet_ntoa(addr));
WSACleanup();
return localIP;
}
int UDPReceiveTest(int port)
{
SOCKET sockSrv;
SOCKADDR_IN addrSrv;
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return 0;
}
if( LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
std::string localIpAddress = GetLocalIpAddress();
printf("Local IP Address is [%s]\n",localIpAddress.c_str());
//创建套接字;
sockSrv = socket(AF_INET,SOCK_DGRAM,0);
addrSrv.sin_addr.S_un.S_addr = inet_addr(localIpAddress.c_str());
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(port);
//绑定套接字;
bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
//等待并接收数据;
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[4096];
printf("Start Listen the port:[%d]...\n",port);
int counter = 0;
int lret = 0;
while(1)
{
lret = ::recvfrom(sockSrv,recvBuf,4096,0,(SOCKADDR *)&addrClient,&len);
if (lret > 0)
{
printf("\r\tReceive package counter:------[%d]",counter++);
//printf("%s\n",recvBuf);
}
if(0 == strcmp(recvBuf,"exit"))
break;
}
//关闭套接字;
::closesocket(sockSrv);
::WSACleanup();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int port = 6000;
if (argc > 1)
{
port = atoi((char*)argv[1]);
}
else
{
printf("Usage: UDPReceiveTest.exe port(default 6000)\n");
}
UDPReceiveTest(port);
return 0;
}
工具连接:http://download.csdn.net/detail/longlong530/5831341
使用截图: