#include <windows.h>
#include <winsock.h>
#include "exdll.h"
extern "C" BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
// check if the socket on the stack is free for binding on localhost
extern "C" void __declspec(dllexport) CheckPort(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
{
// setup nsis environment
EXDLL_INIT();
// get and parse port number
char ports[11];
popnstring(ports,10);
int port = atoi(ports);
if (port <= 0 || port > 65536)
{
pushstring("socket_error");
return;
}
// start winsock
WSADATA wsa_data;
WORD req_version = MAKEWORD(1,1);
if (WSAStartup(req_version, &wsa_data) != 0) {
pushstring("winsock_error");
return;
}
// create and bind a socket
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
pushstring("socket_error");
return;
}
struct sockaddr_in server = {0};
server.sin_port = htons((unsigned short)port);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, (struct sockaddr *)&server, sizeof server) == SOCKET_ERROR)
{
if (GetLastError() == WSAEADDRINUSE)
{
closesocket(sock);
WSACleanup();
pushstring("inuse");
return;
}
closesocket(sock);
WSACleanup();
pushstring("bind_error");
return;
}
closesocket(sock);
WSACleanup();
pushstring("free");
return;
}
NSIS 检测端口是否被占用
2星 需积分: 25 113 浏览量
2013-03-26
23:25:22
上传
评论
收藏 3KB ZIP 举报
youleyang
- 粉丝: 1
- 资源: 18