顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2014年10月6日 星期一

Socket Error 錯誤號碼及原因

在Coding 網路連線資料傳輸時,免不了會遇到的錯誤代碼,記錄如下備查
  • Socket error #0 –
    Direct send error.
    直接傳送錯誤。
  • Socket error #10004 [WSAEINTR] –
    Interrupted function call.
    函式呼叫被中止。
  • Socket error #10013 [WSAEACCES] –
    Permission denied.
    沒有權限。
  • Socket error #10014 [WSAEFAULT] –
    Bad Address.
    不正確的地址。
  • Socket error #10022 [WSAEINVAL] –
    Invalid argument.
    無效的引數(參數)。

2014年1月15日 星期三

[Delphi] 利用Winsock 檢查要使用的Port 是否已被佔用

注意,如果使用Winsock2 無法正常檢查!!
此程式會檢查給的port 是否已經被使用,如果是就+1,直到找到空著(沒有被使用)的埠為止。
function TNetServer.GetFreePort(aPort: Integer): Integer;
var
  _vSock: TSocket;
  _vWSAData: TWSAData;
  _vAddrIn: TSockAddrIn;
begin
  try
  if WSAStartup(MAKEWORD(2, 2), _vWSAData) = 0 then begin
    _vSock := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    try
      if _vSock <> SOCKET_ERROR then begin
        _vAddrIn.sin_family := AF_INET;
        _vAddrIn.sin_addr.S_addr := htonl(INADDR_ANY);
        _vAddrIn.sin_port := htons(APort);
        while (Bind(_vSock, _vAddrIn, SizeOf(_vAddrIn)) <> 0) and (WSAGetLastError = WSAEADDRINUSE) do
        begin
            inc(aPort);
            _vAddrIn.sin_port := htons(aPort);
        end;
      end;
    finally
      CloseSocket(_vSock);
      WSACleanup();
    end;
  end;
  finally
    Result := aPort;
  end;
end;


如果有需要指定範圍,可在 18, 19行間增加如下:


if aPort > XXXXX then aPort := OOOOO;


XXXXX 是最大的埠號值

OOOOO 是最小的埠號值