关于Socket的问题?求救!急急急!!!(40分)

  • 主题发起人 主题发起人 mikor
  • 开始时间 开始时间
M

mikor

Unregistered / Unconfirmed
GUEST, unregistred user!
我是一个SOCKET编程方面的菜鸟。我想编写一个如下的程序。
别人用VC开发了一个client端,我需要开发一个server端,server和client之间以TCP/IP
进行通讯,Socket以长连接的方式进行连接。我要做的就是读取client端传过来的数据包,
根据相应字段的值访问数据库,再向client端发应答数据包(格式与client端过来的一样)。
用VC开发的client传过来的数据包的定义如下:
struct{
unsigned int PType;
unsigned char recnum;
unsigned char totalrec;
unsigned char endflag;
unsigned int Request;
unsigned int Answer;
unsigned char Apu;
unsigned char Channel;
}socket_bao;
socket编程我以前从没有接触过。不知怎样读取数据包和发送数据包。大虾帮帮在下吧,
在下感激不尽!如果有源码的话,请发给我一份,我还会多给分,但要快。
我的信箱:mikor2001@263.net
 
我有一个Delphi和VC之间通过TCP/IP传递对象(Object)信息的例子,
不过VC是服务器Delphi是客户机.
要不要?
 
to creation-zy
要,非常想要。能不能尽快发给我。
我的信箱是:mikor2001@263.net
 
对不起,说大话了。
这个例子是我写的一个网络游戏,一万多行,真正与传递对象有关的部分只占很少一点。
我还是将大体过程描述一下吧(VC就不说了,只讲Delphi部分)。

首先,在窗体种添加一个ClientSocket控件,并正确的设置Address和Port属性.
然后,对ClientSocket1Read事件编程:

procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,totTCPlen:integer;
p1,p0:PChar;
HasWrite:Boolean;
mstr:String;
begin
FillChar(TempRecvBuf,MFsize,0);//将接收缓冲区清空
totTCPlen:=Socket.ReceiveLength;//获得信息包长度(Byte)
if Socket.ReceiveBuf(TempRecvBuf,totTCPlen)=0 then
exit;
...
end;

至于发送信息,用ClientSocket1.Socket.SendBuf(TempRecvBuf,InfoLength);
 
补充:
打开ClientSocket1:
var
ServerAddr:String;
begin
ServerAddr:='127.0.0.1';
with ClientSocket1 do
begin
WriteStrToMemo('正在连接New Mud服务器:'+ServerAddr+':9999 ......');
Address:=ServerAddr;
Port:=9999;
Open;
end;
end;

关于数据结构的收发,应该先在Delphi中定义一个与VC中的一模一样的结构,
这样,当收到VC发过来的信息后,用指针将其强行写入Delphi的结构变量中.
type
Socket_Bao=Record
DWord PType;
Byte recnum;
Byte totalrec;
Byte endflag;
DWord Request;
DWord Answer;
Byte Apu;
Byte Channel;
end;
...
var
xx:Socket_Bao;
P0,P1,i:Byte;
begin
P0:=@TempRecvBuf[0];
P1:=@xx;
for i:=1 to sizeof(Socket_Bao) do
begin
P1^:=P0^;
Inc(P0);
Inc(P1);
end;
//现在你就可以访问xx的属性了
...
end;

理论上应该没什么问题. Good Luck!
 
=>creation-zy
P0,P1,i:Byte;可以解释一下这个定义吗?为什么要是byte?
 
to creation-zy
非常感谢!!!
 
后退
顶部