Socket基本问题 ( 积分: 50 )

  • 主题发起人 主题发起人 新手101010
  • 开始时间 开始时间

新手101010

Unregistered / Unconfirmed
GUEST, unregistred user!
我们开发网络程序都用控件,我想用Socket API来做一个,这样可以知道更多的Socket知道,可我是写的程序服务器不能接收数据,出现的错误是:10053
可我不知道怎么改,请大家指点一下
服务器
…………………………………….
s: TSocket;
Err: Integer;
SockAdd: TSockAddrIn;
Buf: array[0..1023] of Char;
Connected: Boolean;
WSA: WSAData;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);//用API侦听
begin
S := Socket(AF_INET, SOCK_STREAM, 0);
if s < 0 then
begin
Memo1.Lines.Add('不能创建Socket');
Exit;
end;

SockAdd.sin_addr.S_addr:=htonl(INADDR_ANY);
SockAdd.sin_family := AF_INET;
SockAdd.sin_port := htons(7890);
Err := Bind(s, SockAdd, SizeOf(TSockAddrIn));
if Err < 0 then
begin
Memo1.Lines.Add('不能绑定端口');
Exit;
end;

Err := Listen(s, 5);
if Err < 0 then
begin
Memo1.Lines.Add('不能侦听端口');
Exit;
end;
Connected := True;
while Connected do//////////////我知道这么做不好,可现在没办法,还不会用消息
begin
FillChar(Buf, 1024, #0 );
Err := Recv(s, Buf, 1024, 0);

if Err < 0 then
begin
Memo1.Lines.Add('出错:' + IntToStr(GetLastError));
Exit;
end
else if Err = 0 then
begin
Memo1.Lines.Add('客户端已经断开连接');
end
else
begin
Memo1.Lines.Add(Buf);
end;
Application.ProcessMessages;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
WSAStartup(MakeWord(2, 0), WSA);
Connected := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Connected := False;
CloseSocket(s);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WSACleanup();
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(Socket.ReceiveText);/// 收到的是乱码
end;

procedure TForm1.BitBtn1Click(Sender: TObject);///////用ServerSocket实现的,我想看看它数据没,可是收到的是乱码
begin
ServerSocket1.Active := true;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ServerSocket1.Active := False;
end;
客户端
……………………………………
WSAData: WSAData;
s: TSocket;
SerAdd: sockaddr_in;
hp: PHostent;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
Ver: DWord;
begin
Ver := MakeWord(2, 0);
WSAStartup(Ver, WSAData);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WSACleanUp();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Err: integer;
D: String;
begin
s := Socket(AF_INET, SOCK_STREAM, 0);
if s < 0 then
begin
ShowMessage('创建Socket出错');
Exit;
end;
SerAdd.sin_family := AF_INET;
hp := GetHostByName(Pchar(Edit1.Text));
if hp = nil then
begin
ShowMessage('获取主机IP错误');
Exit;
end;
SerAdd.sin_addr := TInAddr(plongint(hp^.h_addr_list^)^);
SerAdd.sin_port := htons(StrToInt(Edit2.Text));
Err := Connect(s, SerAdd, SizeOf(SerAdd));
if Err < 0 then
begin
ShowMessage('不能连接主机');
Exit;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CloseSocket(s)
end;

procedure TForm1.Button3Click(Sender: TObject);
var
d: String;
Err: integer;
begin
d := 'This is a single example.';
Err := Send(S, D, Length(D), 0);
if Err < 0 then
begin
ShowMessage('发送数据失败');
Exit;
end;
end;
大家帮忙
 
我们开发网络程序都用控件,我想用Socket API来做一个,这样可以知道更多的Socket知道,可我是写的程序服务器不能接收数据,出现的错误是:10053
可我不知道怎么改,请大家指点一下
服务器
…………………………………….
s: TSocket;
Err: Integer;
SockAdd: TSockAddrIn;
Buf: array[0..1023] of Char;
Connected: Boolean;
WSA: WSAData;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);//用API侦听
begin
S := Socket(AF_INET, SOCK_STREAM, 0);
if s < 0 then
begin
Memo1.Lines.Add('不能创建Socket');
Exit;
end;

SockAdd.sin_addr.S_addr:=htonl(INADDR_ANY);
SockAdd.sin_family := AF_INET;
SockAdd.sin_port := htons(7890);
Err := Bind(s, SockAdd, SizeOf(TSockAddrIn));
if Err < 0 then
begin
Memo1.Lines.Add('不能绑定端口');
Exit;
end;

Err := Listen(s, 5);
if Err < 0 then
begin
Memo1.Lines.Add('不能侦听端口');
Exit;
end;
Connected := True;
while Connected do//////////////我知道这么做不好,可现在没办法,还不会用消息
begin
FillChar(Buf, 1024, #0 );
Err := Recv(s, Buf, 1024, 0);

if Err < 0 then
begin
Memo1.Lines.Add('出错:' + IntToStr(GetLastError));
Exit;
end
else if Err = 0 then
begin
Memo1.Lines.Add('客户端已经断开连接');
end
else
begin
Memo1.Lines.Add(Buf);
end;
Application.ProcessMessages;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
WSAStartup(MakeWord(2, 0), WSA);
Connected := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Connected := False;
CloseSocket(s);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WSACleanup();
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(Socket.ReceiveText);/// 收到的是乱码
end;

procedure TForm1.BitBtn1Click(Sender: TObject);///////用ServerSocket实现的,我想看看它数据没,可是收到的是乱码
begin
ServerSocket1.Active := true;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ServerSocket1.Active := False;
end;
客户端
……………………………………
WSAData: WSAData;
s: TSocket;
SerAdd: sockaddr_in;
hp: PHostent;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
Ver: DWord;
begin
Ver := MakeWord(2, 0);
WSAStartup(Ver, WSAData);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WSACleanUp();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Err: integer;
D: String;
begin
s := Socket(AF_INET, SOCK_STREAM, 0);
if s < 0 then
begin
ShowMessage('创建Socket出错');
Exit;
end;
SerAdd.sin_family := AF_INET;
hp := GetHostByName(Pchar(Edit1.Text));
if hp = nil then
begin
ShowMessage('获取主机IP错误');
Exit;
end;
SerAdd.sin_addr := TInAddr(plongint(hp^.h_addr_list^)^);
SerAdd.sin_port := htons(StrToInt(Edit2.Text));
Err := Connect(s, SerAdd, SizeOf(SerAdd));
if Err < 0 then
begin
ShowMessage('不能连接主机');
Exit;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CloseSocket(s)
end;

procedure TForm1.Button3Click(Sender: TObject);
var
d: String;
Err: integer;
begin
d := 'This is a single example.';
Err := Send(S, D, Length(D), 0);
if Err < 0 then
begin
ShowMessage('发送数据失败');
Exit;
end;
end;
大家帮忙
 
d := 'This is a single example.';
Err := Send(S, pointer(D)^, Length(D), 0);
if Err < 0 then
begin
ShowMessage('发送数据失败');
Exit;
end;
 
收到乱码是因为你发送的就是乱码!
 
学习 这些内容
 
to 张无忌
你按你说的做了,如果用ServerSocket接收信息是正确的,可我用我写的代码却不能侦听端口,提示10053的错误?这是为什么?????
 
我加了
temps := Accept(s, 0, 0);
可运行到这步程序就死了,是怎么回事?
 
10053 您的主机中的软件放弃了一个已建立的连接。
 
你看看VCL是怎么封装的。
 
谁能指点一二
 
来自:新手101010, 时间:2005-4-11 20:29:34, ID:3040276
我加了
temps := Accept(s, 0, 0);
可运行到这步程序就死了,是怎么回事?
==========================

并不是死机了,因为accept本来就是阻塞的,所以程序到这里来了个假死
最普通(简单)的方法是开一个accept专用线程,用于等待客户端的socket连接请求,每来一个连接请求,就单独开一个线程专门处理该连接里的所有收发处理
当然,连接数量很大了以后是绝对不能用这种简单的方法处理的,到时候就得iocp了~
 
结帖,学习到太多的东东了,谢谢大家
 

Similar threads

后退
顶部