winsock的初級問題(100分)

  • 主题发起人 主题发起人 abchjb
  • 开始时间 开始时间
A

abchjb

Unregistered / Unconfirmed
GUEST, unregistred user!
本人剛學習使用winsock.編寫一個簡單程序即出現錯誤;
想在Server端使用非阻塞方式,在Client端使用阻塞方式(也不知是否
可以),但在Client端沒法讀出數居;

procedure TForm1.Button1Click(Sender: TObject);
var
Ts:TWinSocketStream;
Buffer:string;
begin
cs.host:='localhost';
cs.Active:=True;

ts:=TWinSocketStream.Create(cs.socket,10000);
try
while cs.Active do
begin
buffer:='';
if ts.Read(Buffer, 4) = 0 then
begin
aaa1:='';
end
else
begin
aaa1:=buffer;
end;
Cs.Active:=False;
end;
finally
ts.Free;
end;

if aaa1 = '正式' then
Image1.Picture.LoadFromFile('c:/cao/wact/ok.bmp')
else if aaa1 = '錯誤' then
Image1.Picture.LoadFromFile('c:/cao/wact/aaa.bmp')
else if aaa1 = '沒有' then
Image1.Picture.LoadFromFile('c:/cao/wact/ccc.bmp');
caption:=aaa1;
end;

Sever端只是發送'正式'等漢字.
 
>想在Server端使用非阻塞方式,在Client端使用阻塞方式

不可以!
 
连接成功了吗?
 
seasky???
阻塞非阻塞只是针对本机而言的.
一个是socket通讯时发出请求后程序停止运行(阻塞)并等待server回应,
另一个是发出请求后程序继续运行(非阻塞), 如果server回应则触发事件.
 
为什么代码里没看见设置port ?
 
我想port是在设计时设定的,client当然可以随便选择nonBlocking vs. Blocking,
但好像在组塞方式中要用到WaitforData来等待server准备好数据.
 
哎呀,刚接触socket,看书没仔细,用的又少, 瞎说的, 别见怪。
我需要再仔细研究一下Winsocket, 我刚接手一个项目便是Socket的
传输, 原来的人写的程序好看的和用的难过.....
 
ts没设port当然不行!
 
實在不行,是否能請那位仁兄
將阻塞方式下 Client/Server
通訊的程序貼上?謝謝.
另外,本人的程序port在設計時
設置了.
 
以下是我的代码,cb,CLIENT和SERVER都设置成非阻塞,这样才会有消息响应.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ServerSocket1->Open();
ClientSocket1->Open();
ClientSocket1->SendText("Info");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
Socket->SendText(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString st=Socket->ReceiveText();
Memo1->Lines->Add(st);
Socket->SendText(st);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClientSocket1->Socket->SendText(Edit1->Text);
}
//---------------------------------------------------------------------------
 
都使用阻塞模式是完全可以的.
但是我建议你服务器端使用阻塞模式客户端使用非阻塞模式. 这完全是效率上
的考虑. 如果可能的话, 服务器端还可以考虑 ioctl
至于示范程序, 我现在时间不多. 也许明天我再贴上一个.
 
在delphi中,如何做到广播社通信,即将一个信息发给所有的用户(已与server建立连接的client)

哥们先谢谢众位大虾!!!
 
接受答案了.
 
后退
顶部