原理就是使用套接字的bind函数,如果bind返回的是WSAEADDRINUSE就是端口被占用。
效果图:
实现代码:
UpdateData(TRUE);
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
int iPort;
CString strPort;
m_cmdPort.GetWindowText(strPort);
iPort=atoi(strPort);
SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s,(LPSOCKADDR)&addr,sizeof(addr));
if(WSAGetLastError()==WSAEADDRINUSE)
{
m_used.SetWindowText("端口已被占用");
}
else
{
m_used.SetWindowText("");
}
UpdateData(FALSE);
记得要加上ws2_32.lib包含winsock就可以了。