我想给udp socket绑定一个端口,可是怕被其它软件占用,所以把端口定义了一个范围,请问该如何实现???? 以前做法是直接绑定一个0端口,这样系统会给分配一个系统中未被使用的端口,可是我如何能给其添加一个范围呢?? 比如我想绑定(9001-9999)中一个系统没有被使用的端口?
解决方案 »
- char*text[]动态调用问题
- vc6.0中配置directshow开发环境
- 我用CTime::GetCurrentTime();得到的时间,如何最快速的转化成从1970.01.01到现在经历过的秒数阿
- 码流是什么?
- 各位大虾,有没人调试通过emule0.44b的源码啊!!顺便散分!!
- 对话框应用程序的问题??
- 问一个小小的问题
- 紧急问题,在线等待
- 高分(在线马上送分),自定义的CXListCtrl中调用对话框?
- 如何将一堆.htm、.html文件自动合成一个HtmlHelp Workshop工程,这里有工具,提交Email我便给!!!
- [超级难题]ATL生成的Dll如何调用JavaScript写的函数,分可再加
- 如何在PreTranslateMessage(MSG * pMsg)中处理Ctrl+C和Ctrl+V
int CSocketBase::BindEx(SOCKET s, short port, DWORD ip /*=INADDR_ANY*/)
{
ASSERT(m_hSocket != INVALID_SOCKET);
sockaddr_in LocalAddr;
int nTemp = port;
int nResult = 0;
BOOL bTautology = FALSE;
do
{
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = htonl(ip);
LocalAddr.sin_port = htons(nTemp);
// Bind the socket handle on local host
// If bind falied and error be WSAEADDRINUSE
// then redistribute port
nResult = bind(m_hSocket, (sockaddr*)&LocalAddr, sizeof(LocalAddr));
if(nResult == SOCKET_ERROR)
{
int nError = WSAGetLastError();
TRACE("bind() falied with error code %d\n", nError);
if(nError == WSAEADDRINUSE)
{
bTautology = TRUE;
nTemp++;
}
}
else
{
bTautology = FALSE;
}
} while(bTautology); return nResult;
}
循环检测的方法的确简单实用,但是我的bind这段代码是单独封装的,调用的地方很多,如此一下改动比较大!(请大家不要问我mynamelj(夏娃的诱惑)提供的代码也不需要太多的改动啊,因为我的实际情况描述起来一言难尽,请大家谅解)
能不能有一种方式,在使用bind之前,采用set***之类的函数预先设定一下范围呢?
十万火急!!!!!!!
const static BOOL PortUsedUDP(ULONG uPort)
{
MIB_UDPTABLE UdpTable[100];
DWORD nSize = sizeof(UdpTable);
if(NO_ERROR == GetUdpTable(&UdpTable[0],&nSize,TRUE))
{
DWORD nCount = UdpTable[0].dwNumEntries;
if (nCount > 0)
{
for(DWORD i=0;i<nCount;i++)
{
MIB_UDPROW UdpRow = UdpTable[0].table[i];
DWORD temp1 = UdpRow.dwLocalPort;
int temp2 = temp1 / 256 + (temp1 % 256) * 256;
if(temp2 == uPort)
{
return TRUE;
}
}
}
return FALSE;
}
return FALSE;
}
能兼容Linux吗?
TCP如果需要明天我贴上来
Linux的应该不行的...
其实udp就可以满足我的要求了,不过我想再封装的时候顺便把tcp的也做了,免得日后用的时候费脑筋!呵呵!
今天整天都有事,不好意思啊
const static BOOL PortUsedTCP(ULONG uPort)
{
MIB_TCPTABLE TcpTable[100];
DWORD nSize = sizeof(TcpTable);
if(NO_ERROR == GetTcpTable(&TcpTable[0],&nSize,TRUE))
{
DWORD nCount = TcpTable[0].dwNumEntries;
if (nCount > 0)
{
for(DWORD i=0;i<nCount;i++)
{
MIB_TCPROW TcpRow = TcpTable[0].table[i];
DWORD temp1 = TcpRow.dwLocalPort;
int temp2 = temp1 / 256 + (temp1 % 256) * 256;
if(temp2 == uPort)
{
return TRUE;
}
}
}
return FALSE;
}
return FALSE;
}
不知道我说清楚了没有,最近天天加班到很晚,状态不是很好!
然后Bind有问题再继续就可以一般很少冲突的了
或者 CreateMutetex(Handle)
都是系统提供的