socket的问题!!!!(200分)

  • 主题发起人 Williamyoung
  • 开始时间
W

Williamyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序如下,但是一运行thread的时候,就说accept出错了,不知道怎么回事,请高手指点一下应该怎么写socket服务端的程序

unit UServer;

interface

uses
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.
 
从代码上看不出什么毛病啊,你把accept以外的部分移到thread外看看。
 
移到外面去也不行,不知道怎么回事[:(]
 
随便看了一下……觉得Socket服务器线程并发处理客户端请求不应该是这样做的,具体的方
法应该是主线程建立socket服务端监听,在accept到客户端连接之后再建立线程,对此fd(句柄)
进行读写操作,像你这样在每个线程里都建立一个socket服务器,而端口号又是一样的,恐怕
是无法重复打开一个端口号的(在进程里是这样的,线程里还没试过),监听的错误可能也是源于
此的。
 
问题已经解决了
写错一个字母addrc: PSockAddr;
应该是TSockAddr
及其郁闷,但是还是谢谢各位
 
呵呵呵!写错一个字母,让俺瞪大了眼睛瞧了半天也没瞧出来。
 
顶部