DelphiでWinsockを使ってサーバを書いてみる

ふと、思い立ってDelphiでWinsockを使ってみる。Delphi2009
echoサーバを書いてみた。

EchoServer.dpr

program EchoServer;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils, Winsock;

const
  PORT = 5000;
  IP = '0.0.0.0';

var
  wsdata: WSAData;
  sockServer, sockClient: TSocket;
  addrServer, addrClient: TSockAddr;
  sReceivedData: AnsiString;
  buf, sendbuf: Array[0..255] of AnsiChar;
  intReceivedSize: Integer;
  AddrLength: Integer;
begin
  if WSAStartup($101, wsdata)<>0 then
  begin
    WriteLn('Winsock Error.');
    Exit;
  end;
  WriteLn('Listen: ', IP, ':', PORT);
  sockServer := socket(AF_INET, SOCK_STREAM, 0);
  if sockServer = INVALID_SOCKET then
    WriteLn('Invalid socket.');
  addrServer.sin_family := AF_INET;
  addrServer.sin_port := htons(PORT);
  addrServer.sin_addr.S_addr := inet_addr(IP);
  bind(sockServer, addrServer, SizeOf(addrServer));
  while True do
  begin
    // 待受開始
    listen(sockServer, 1);
    AddrLength := SizeOf(addrClient);
    sockClient := accept(sockServer, @addrClient, @AddrLength);
    sReceivedData := '';
    while True do
    begin
      ZeroMemory(@buf, SizeOf(buf));
      intReceivedSize := recv(sockClient, buf, SizeOf(buf), 0);
      if intReceivedSize = SOCKET_ERROR then
      begin
        WriteLn('SocketError.');
        Break;
      end;
      // クライアント側での切断
      if intReceivedSize = 0 then
      begin
        WriteLn('Connection closed.');
        Break;
      end;
      // 受け取ったデータを貯めておく
      sReceivedData := sReceivedData + buf;
      // 改行コードが送られてきたら、貯めてたデータを返す
      if Pos(#13, string(sReceivedData)) <> 0 then
      begin
        Write(sReceivedData);
        ZeroMemory(@sendbuf, SizeOf(sendbuf));
        StrCopy(@sendbuf, PAnsiChar(sReceivedData));
        send(sockClient, sendbuf, Length(sendbuf), 0);
        sReceivedData := '';
      end;
    end;
  end;
  WSACleanup;
end.

動かすとこんな感じ。