我的程序如下,但是一运行thread的时候,就说accept出错了,不知道怎么回事,请高手指点一下应该怎么写socket服务端的程序unit UServer;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, winsock;type
  TForm1 = class(TForm)
    MemInfo: TMemo;
    BtnStart: TButton;
    procedure FormCreate(Sender: TObject);
    procedure BtnStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
{$R *.DFM}
function ThreadFunc():String;
var
  skt, sktaccept: TSOCKET;
  addr: TSockAddr;
  addrc: PSockAddr;
  BufRecv: PChar;
  SRecv: String;
  rebind: Integer;
  relisten: Integer;
  addrcLen: Integer;
  relog:Integer;
  getbuf: array[0..1024] of char;
begin
  skt := socket(AF_INET, SOCK_STREAM, 0);
  //skt := socket(AF_INET, SOCK_DGRAM, 0);
  try
    if (skt = INVALID_SOCKET) then
    begin
      Form1.MemInfo.Lines.Add('Error:Create socket failed!');
      exit;
    end;
    //MemInfo.    ZeroMemory(@addr, sizeof(addr));
    addr.sin_family := AF_INET;
    addr.sin_addr.S_addr := htonl(INADDR_ANY);
    addr.sin_port := htons(12);    rebind:=bind(skt, addr, sizeof(addr));
    if rebind<>0 then
    begin
      Form1.MemInfo.Lines.Add('Error: Bind Socket failed');
      exit;
    end;
    Form1.MemInfo.Lines.Add('Bind Socket Succeed');    relisten := listen(skt,5);
    if relisten<>0 then
    begin
      Form1.MemInfo.Lines.Add('Error: Listen Socket failed');
      exit;
    end;
    Form1.MemInfo.Lines.Add('Listen Socket Succeed');    addrcLen := sizeof(addrc);
    While true do
    begin
      sktaccept := accept(skt, addrc, PInteger(addrcLen));      if sktaccept >= 0 then Form1.MemInfo.Lines.Add('Accept Socket='+ InttoStr(sktaccept)+ 'succeed')
      else Form1.MemInfo.Lines.Add('Accept Socket='+ InttoStr(sktaccept)+ 'failed');      if sktaccept >= 0 then
      begin
        relog := recv(sktaccept,getbuf,sizeof(getbuf),0);
        if relog < 0 then continue
        else
        begin          SRecv:=getbuf;
          Form1.MemInfo.Lines.Add(SRecv);
        end;
      end
      else
      begin
        Form1.MemInfo.Lines.Add('Error!');
        break;
      end;
    end;
    Form1.MemInfo.Lines.Add('Finish');
  except
    Closesocket(skt);
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
  WSAData: TWSAData;
begin
  if (WSAStartup(MAKEWORD(2, 0), WSAData) <> 0) then
  begin
    MemInfo.Lines.Add('Winsock Init Failed');
    exit;
  end
  else MemInfo.Lines.Add('Socket Start');
end;procedure TForm1.BtnStartClick(Sender: TObject);
var
  hThread: THandle;
  ThreadID: DWord;
begin
  hThread := CreateThread(nil, 0, @ThreadFunc, nil, 0, ThreadID);
  if hThread = 0 then
    MessageBox(Handle, 'No Thread', nil, mb_ok);
end;end.

解决方案 »

  1.   

    先不要用线程,看看accept出错吗?
      

  2.   

    找到了,是这里错了function ThreadFunc():String;
    var
      skt, sktaccept: TSOCKET;
      addr: TSockAddr;
      addrc: PSockAddr;
      BufRecv: PChar;
      SRecv: String;
      rebind: Integer;
      relisten: Integer;
      relog:Integer;
      getbuf: array[0..1024] of char;
     // function InitSocket(Client: boolean; IPAddress: string; Port: word): TSockAddrIn;
     // begin
     //   Result.sin_family := PF_INET;
     //   if Client then
     //     Result.sin_addr.S_addr := inet_addr(pchar(IPAddress))
     //   else
     //     Result.sin_addr.S_addr := INADDR_ANY;
     //   Result.sin_port := htons(Port);
     // end;
    begin
      skt := socket(AF_INET, SOCK_STREAM, 0);
      //skt := socket(AF_INET, SOCK_DGRAM, 0);
      try
        //addr := InitSocket(False, '', 3000);
        if (skt = INVALID_SOCKET) then
        begin
          Form1.MemInfo.Lines.Add('Error:Create socket failed!');
          exit;
        end;
        //MemInfo.    ZeroMemory(@addr, sizeof(addr));
        addr.sin_family := AF_INET;
        addr.sin_addr.S_addr := htonl(INADDR_ANY);
        addr.sin_port := htons(12);    rebind:=bind(skt, addr, sizeof(addr));
        if rebind<>0 then
        begin
          Form1.MemInfo.Lines.Add('Error: Bind Socket failed');
          exit;
        end;
        Form1.MemInfo.Lines.Add('Bind Socket Succeed');    relisten := listen(skt,5);
        if relisten<>0 then
        begin
          Form1.MemInfo.Lines.Add('Error: Listen Socket failed');
          exit;
        end;
        Form1.MemInfo.Lines.Add('Listen Socket Succeed');
        //addrcLen := sizeof(addrc);  // 这里!!!!!!!!!!!!!!
        addrcLen := sizeof(TSockAddrIn);
        While true do
        begin
          sktaccept := accept(skt, addrc, @addrcLen);      if sktaccept >= 0 then Form1.MemInfo.Lines.Add('Accept Socket='+ InttoStr(sktaccept)+ 'succeed')
          else Form1.MemInfo.Lines.Add('Accept Socket='+ InttoStr(sktaccept)+ 'failed');      if sktaccept >= 0 then
          begin
            relog := recv(sktaccept,getbuf,sizeof(getbuf),0);
            if relog < 0 then continue
            else
            begin          SRecv:=getbuf;
              Form1.MemInfo.Lines.Add(SRecv);
            end;
          end
          else
          begin
            Form1.MemInfo.Lines.Add('Error!');
            break;
          end;
        end;
        Form1.MemInfo.Lines.Add('Finish');
      except
        Closesocket(skt);
      end;
    end;