原理就是使用套接字的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就可以了。