网络编程经验的高手看进来,请教问题(极具挑战性,请求帮助)

libra01 2003-07-15 02:55:25
大家好,我最近在搞一个P2P的课题,要求用DELPHI开发,我以前没有相关网络编程经验。所以遇到很大的问题。
请教!!!

我有不懂的地方是:
1最基本的通讯协议实现UDP,TCP。Socket的传送,数据帧的组织。
2文件如何传输,如何跨网,如何绕防火墙
3信息如何发送,如何通过服务器中转,采用什么方式,如何扩充为语音,视频如何处理。
4好友如何管理,在客户端、服务器端要怎么处理,在线好友如何查询、更新、维护
5怎么使用SOCK 5代理和HTTP代理用在程序中。

大家都是程序员,请求大家帮帮忙,因为时间实在太短,要求在一个月内做完。现在开发文档还没写,因为我实在理解不了P2P,实在缺乏网络编程的经验。。。唉。

恳求各位老鸟有力出力,写写你们的思路,贴上你们的代码看看好吗?

声明:我不会把代码作为商用,仅作参考而已。因为这个课题可能会实际中使用,性能要求高一点。
...全文
11 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
猛禽 2003-09-08
请教sevencat(七猫)兄
如果网络开发不是DELPHI的强项,那什么才是?
用得最多的FTP服务端:SERV-U都是用DELPHI写的。

P2P没做过,8过网上可以找到BT的源码(是用PYTHON写的),可以参考一下
回复
zawload 2003-09-08
libra01 (龙卷风)
你好,你的E_mail是?
我给你一个相关例子,可能对你有点帮助,采用的是UDP(使用Indy控件组).
回复
libra01 2003-09-07
继续关注!
回复
sxzxz 2003-07-19
是啊不知道其中很多的问题啊
回复
solonet 2003-07-19
可怜天下程序员,一个月时间,哪有这么快!

UP
回复
e5022 2003-07-19
1个月,太强求了
回复
libra01 2003-07-19
时间太短,不用delphi用什么???
回复
sevencat 2003-07-18
老大,这种东西用DELPHI开发太累了,搞不懂,明明不是DELPHI的强项,
回复
libra01 2003-07-18
回复
daniel2008 2003-07-17
我也不懂.up
回复
baibaichen 2003-07-17
用Indy吧,你可以到www.51delphi.Com上找到一本,Indy in Depth的电子书。

另外,Indy的Demo很多。
回复
libra01 2003-07-16
请继续跟贴。
协议部分的处理???
回复
libra01 2003-07-16
谢谢各位,

请教DelphiBoy2003(一朵梨花压海棠,玉树临风胜潘安) 的联系方式。

我的联系方式是:QQ:3569555
回复
ilymtics 2003-07-16
//这个类可以连接sock5代理, 不完整,只有与sock5通讯的部分
unit Sockets;
interface

uses
Windows, Messages, Winsock,lzrw1kh,YkPub,irpServer,pubclass,myMars;

resourceString
err_CanntInitSockDll ='不能初始化wsock32.dll库';
err_canntCreateSocket ='不能创建Socket';
err_canntConnectServer= '连接服务器失败';
err_canntConnectProxyServer= '连接代理服务器失败';
err_unkownServer = '给定的主机名或者IP地址不正确';
err_timeout ='Socket操作超时,可能连接已经被中断';

err_proxyVer = '代理服务器版本不对';
const
SD_BOTH = $02;

port_access = 'access';
port_config = 'config';
port_publish = 'publish';

type
//与socks5代理服务器连接所需要的结构
Tsock5req1 = record
Ver :byte;
nMethods:byte;
Methods :array [1..255]of byte;
end;

Tsock5ans1 = record
Ver :byte;
Method :byte;
end;

Tsock5req2 = record
Ver :byte;
Cmd :byte;
Rsv :byte;
Atyp :byte;
other :array [1..255] of byte;
end;

Tsock5ans2 = record
Ver :byte;
Rep :byte;
Rsv :byte;
Atyp :byte;
other :array [1..255] of byte;
end;

Tauthreq = record
Ver :byte;
Ulen :byte;
Name :array [1..255] of byte;
PLen :byte;
Pass :array [1..255] of byte;
end;

Tauthans = record
Ver :byte;
Status:byte;
end;
//
TBlockSocket= class;
TSockEventType = (ST_WRITE,ST_READ,ST_COM,ST_DECOM);
TSockEvent = procedure(sender:TBlockSocket;event:TSockEventType;param:Pointer); stdCall;
TBlockSocket = class(TObject)
private
Fcancel :boolean;
FconInfo :TConnectInfo;
protected
TimeOut : DWORD;
m_SockAddr: TSockAddr;
Handle : TSocket;
hwnd : HWND;
FBlock : boolean;
waitEvent : integer;
FError : WORD;
procedure DoReceive(Buffer: Pointer; ReceiveLen: LongInt);Dynamic;
procedure DoSend(Buffer: Pointer; SendLen: LongInt);Dynamic;
procedure doSockMessage(var Message: TMessage);
procedure processMessage();
function WaitFor(event: Integer): Boolean;
procedure negotiate_Socks5();
public
p1,p2,p3 :pointer;
onSockEvent :Pointer;
onObjSockEvent :procedure(event:TSockEventType;param:Pointer)of object;
procedure doSockEvent(event:TSockEventType;param:Pointer);
procedure Cancel;
procedure continue;
procedure setBlock(value :boolean);
constructor Create;
destructor Destroy;override;
function getConnectInfo():TConnectInfo;
function ErrorTest(Evaluation: LongInt): LongInt;
function isIp(ipOrServerName: String):boolean;
procedure DoClose;
procedure DoConnect(ci :TConnectInfo);
function isActive():boolean;
procedure setSoTimeout(value :DWORD);
function getSockAddr(ipOrServerName:String;port:word):TSockAddr;
procedure setCloseWait(value :boolean);
function ErrToStr(Err: LongInt): String;
end;


implementation
{ TBlockSocket }


procedure TBlockSocket.negotiate_Socks5;
var
sock5req1 :Tsock5req1;
sock5ans1 :Tsock5ans1;
sock5req2 :Tsock5req2;
sock5ans2 :Tsock5ans2;
authreq :Tauthreq;
authans :Tauthans;
ip :Cardinal;
needSendLen :integer;
Port :word ;
begin
////与socks5代理服务器通话
sock5req1.Ver := 5 ;
sock5req1.nMethods := 2;
sock5req1.Methods[1] := 0;
sock5req1.Methods[2] := 2;{-------------------------->|X'00' NO AUTHENTICATION REQUIRED}
doSend(@sock5req1,4); {| X'01' GSSAPI}
DoReceive(@sock5ans1,2); {| X'02' USERNAME/PASSWORD}
if sock5ans1.Ver<>5 then {| X'03' to X'7F' IANA ASSIGNED}
raise Exception.Create(err_proxyVer); {| X'80' to X'FE' RESERVED FOR PRIVATE METHODS}
if (sock5ans1.Method<>0)and(sock5ans1.Method<>2)then {| X'FF' NO ACCEPTABLE METHODS}
raise Exception.Create('代理服务器不支持所需的功能');
if sock5ans1.Method=2 then//需要用户验证
begin
authreq.Ver := 5;
authreq.Ulen := length(FconInfo.proxyUser);
authreq.PLen := length(FConInfo.proxyPass);
strCopy(@authreq.Name[1],Pchar(FconInfo.proxyUser));
strCopy(@authreq.Pass[1],Pchar(FconInfo.proxyPass));
doSend(@authreq,SizeOf(authreq));
doReceive(@authans,sizeOf(authans));
if authans.Status<>0 then
raise Exception.Create('代理服务器用户验证不成功!');
end;
sock5req2.Ver := 5;
sock5req2.Cmd := 1;// CONNECT X'01' BIND X'02' UDP ASSOCIATE X'03'
sock5req2.Rsv := 0;//保留
ip := INet_Addr(PChar(FconInfo.ip));
Port := htons(FconInfo.port);
if (ip<>INADDR_NONE)and(ip<>0) then {地址类型}//IP V4 address: X'01' DOMAINNAME: X'03' IP V6 address: X'04'
begin
sock5req2.Atyp := 1;
copyMemory(@sock5req2.other[1],@ip,4);
copyMemory(@sock5req2.other[5],@Port,2);
needSendLen := 4 + 4 + 2;{ver cmd rsv atyp + ip + port}
end else
begin
sock5req2.Atyp := 3;
copyMemory(@sock5req2.other[1],Pchar(FconInfo.ip),Length(FconInfo.ip));
copyMemory(@sock5req2.other[1+Length(FconInfo.ip)],@port,2);
needSendLen := 4 + Length(FconInfo.ip) + 2;{ver cmd rsv atyp + ip + port}
end;
doSend(@sock5req2,needSendlen);
doReceive(@sock5ans2,needSendLen);
if sock5ans2.ver <> 5 then
raise Exception.Create(err_proxyVer);
case sock5ans2.Rep of
0 :;//success.
1 :raise Exception.Create('general SOCKS server failure');
2 :raise Exception.Create('connection not allowed by ruleset');
3 :raise Exception.Create('Network unreachable');
4 :raise Exception.Create('Host unreachable');
5 :raise Exception.Create('Connection refused');
6 :raise Exception.Create('TTL expired');
7 :raise Exception.Create('Command not supported');
8 :raise Exception.Create('Address type not supported');
{o X'00' succeeded
o X'01' general SOCKS server failure
o X'02' connection not allowed by ruleset
o X'03' Network unreachable
o X'04' Host unreachable
o X'05' Connection refused
o X'06' TTL expired
o X'07' Command not supported
o X'08' Address type not supported
o X'09' to X'FF' unassigned}
end;
end;

initialization
wm_msgsock := RegisterWindowMessage('yukun socket message');
if wm_msgsock = 0 then wm_msgsock := wm_user +1000;
finalization

end.
回复
DelphiBoy2003 2003-07-15
根本不需要绕过防火墙,如果你的程序是合法的,那么用户自然会允许你的程序访问网络,那么这样还需要绕过防火墙吗?
其他的都很容易,使用Indy控件组完全搞定
回复
copy_paste 2003-07-15
1:说不清
2: 你到VC的网络版那里,找找UDP怎么进行P2P的资源。
3:信息如何发送,就是最基本的: send, sendto。语音也好,视频也好,说白了,就是数据流,信息怎么发送的,它们就怎么发送。
4:好友,数据库程序中表里总是会记录一些如:生日,男女,什么的,你不会加个字段:好友。
5:不懂,好像jingtao发过一篇文章,你到DFW找找。
回复
whxhz80 2003-07-15
关注
回复
whxhz80 2003-07-15
又是穿越防火墙啊,很多讨论都没有结果啊
回复
相关推荐
发帖
网络通信/分布式开发
创建于2007-08-02

1573

社区成员

Delphi 网络通信/分布式开发
申请成为版主
帖子事件
创建了帖子
2003-07-15 02:55
社区公告
暂无公告