我的程序如下,但是一运行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.
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.
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;