使用socket编程时的问题..(200分)

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

atomy

Unregistered / Unconfirmed
GUEST, unregistred user!
这里部分原代码.
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while socket.ReceiveLength>0 do
begin
//申请内存
re:=AllocMem(socket.receivelength);
TRY
relong:=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.receivelength);
sBuf:=strpas(re);
Setlength(sbuf,relong);

//count lenght
TotalLen:=TotalLen+ relong;
S1.Panels.Items[1].Text:='Total Received (Byte): ' + IntToStr(TotalLen);
S1.Update();
FINALLY
freemem(re);
END;
M1.Lines.Add(sbuf);
end;
end;



我想问为什么要申请内存???这样做有什么用?书里没有讲到.还有就是socket服务端如何与多个客户端的其中一个指定
客户端通讯?
 
你申请了内存才能存放港接收的数据啊
ServerSocket的属性Socket是TServerWinSocket类型的
他有个属性是Connections,保存了所有和客户端连接的TCustomWinSocket
用它可以和某个或者全部客户端通信
TCustomWinSocket的Data属性可以用来保存你自定义的信息,比如,在创建连接的时候可以记下机器名之类的,
活这他传来用户/密码之类的,可以保存在这里,以后翻出data来就知道他是什么
 
请问PiPi.有没有如同下面功能的简单源代码吗???
1,客户端提交一个用户名与密码到服务端.
2,服务端判断这个客户端送来的用户名与密码.
3,如果成功,就返回一条信息,否则就把这个指定客户端的链接断开.




 
ServerSocket的OnClientRead事件,
检查 Socket.Data 是不是已经登陆的标志,是的话可以做任何操作
不是的话,那么读入的必须是登陆信息,……读入登陆信息
如果登陆正确,那么设置 Socket.Data 给他一个已经登陆的标志
如果登陆不正确,Socket.Close关闭与客户的连接
 
你自己申请的内存是属于用户内存,windows tcp/ip协议的实现在系统核心有一个socket的
内存缓冲,接受和发送实际上都包括内存从用户态copy到核心态这么一个过程,用户态和核
心态切换是要耗费系统资源的。在对性能要求很高的服务器中,一般由自己来管理。
 
DELPHI5里的ServerSocket的属性Socket 里面的方法好像不太全,请问那能找到详细的方法说明?
 
全啊,不会不全,你想知道什么?
 
ServerSocket的属性Socket 是 TServerWinSocket
你查他就可以了
 
再向Pipi问个问题。

re:=AllocMem(socket.receivelength);
TRY
relong:=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.receivelength);


这里面中 re 是什么类型的变量?而使用了 ' ^ ' 后,成为 re^ 又代表什么意思?


BTW:盼望你的答复,或者我现在把分结了再另开个问题如何?
 
多人接受答案了。
 
后退
顶部