急急急!谁知道用winsocket通过代理服务器建立连接 (200分)

  • 主题发起人 主题发起人 kuangwenwei
  • 开始时间 开始时间
K

kuangwenwei

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正在做一个文件传输软件,
在两个不同局域网中的计算机利用Winsocket要怎样才能连接起来?
我的EMAIL:kww2002@sina.com
 
你看看这个方法可以不

* 在服务器应用程序中声名Socket全局变量,并使其处于听等状态以等待客户端与其建立连接:

  CListeningSocket? m—pSocket;

  m—pSocket = new CListeningSocket(this);

if (m—pSocket-〉Create(Dialog.m—nPort+700))

{ if (m—pSocket-〉Listen())

return TRUE;

}

  * 当接到客户端的主动连接时或接到数据时,调用文档类接收新客户的处理函数:

  void CListeningSocket::OnAccept(int nErrorCode)

  { CSocket::OnAccept(nErrorCode);

m—pDoc-〉ProcessPendingAccept(); //调用文档类成员函数,以生成新的对话线程

  }

  * 服务器Socket的网上数据发送与接收操作:

  void CClientSocket::SendMsg(CMsg? pMsg)

  { if (m—pArchiveOut != NULL)

{ pMsg-〉Serialize(?m—pArchiveOut);

  //调用按协议自定义信息类(CMsg)的函数

m—pArchiveOut-〉Flush();

  //Serialize进行网上信息发送操作

} }

  void CClientSocket::ReceiveMsg(CMsg? pMsg)

  { pMsg-〉Serialize(?m—pArchiveIn); } //调用按协议自定义信息类(CMsg)的函数

  //Serialize进行网上信息接收操作


  客户端建立连接与通信实现


  * 新客户与服务器端建立连接:

  BOOL CChatDoc::ConnectSocket(LPCTSTR lpszHandle, LPCTSTR lpszAddress, UINT nPort)

  { m—strHandle = lpszHandle;

m—pSocket = new CChatSocket(this);

if (!m—pSocket-〉Create())

{...} // 创建新Socket失败处理

  while (!m—pSocket-〉Connect(lpszAddress, nPort + 700))

  {...} //与服务器建立连接失败后的处理

m—pFile = new CSocketFile(m—pSocket);

m—pArchiveIn = new CArchive(m—pFile,CArchive::load);

m—pArchiveOut = new CArchive(m—pFile,CArchive::store);// 建立通信流对象

return TRUE; }

  * 客户端从流中读入网上信息:

  void CChatDoc::ReceiveMsg()

  { CMsg msg;

TRY { msg.Serialize(?m—pArchiveIn);

  //调用按协议自定义信息类(CMsg)的函数

while(!msg.m—msgList.IsEmpty()) //Serialize进行网上信息接收操作

{...

CATCH(CFileException, e) {... } END—CATCH // 出错处理

if (msg.m—bClose)

{...} // 关闭连接的善后处理

  }

  * 客户端通过流进行网上发送信息:

  void CChatDoc::SendMsg(CString& strText,int index,int i)

  { if (m—pArchiveOut != NULL)

{ CMsg ?msg;

   msg=AssembleMsg(index,i);

  // 装配信息

TRY { msg-〉Serialize(?m—pArchiveOut); //调用按协议自定义信息类(CMsg)的函数

m—pArchiveOut-〉Flush();

  // Serialize进行网上信息发送操作

}

CATCH(CFileException, e)

{ ...... } // 出错处理

END—CATCH

}

  }
 
可将文件分割后发送,发送端的代码如下:
var
FileFrom,FileTo,Send,Temp:String;
MemStr:TMemoryStream;
SendTimes,i:Integer;
SendState:String;
Socket:TCustomWinSocket;

const SckMaxDataLength:Integer=2048;
begin
MemStr:=TMemoryStream.Create;
MemStr.LoadFromFile(FileFrom);
SetString(Send,PChar(MemStr.Memory),MemStr.Size);
if Length(Send) mod SckMaxDataLength=0 then SendTimes:=0
else SendTimes:=1;
Inc(SendTimes,Length(Send) div SckMaxDataLength);
for i:=0 to SendTimes-1 do
begin
if i=0 then SendState:='0'//只有一个包
else if i=SendTimes-1 then SendState:='2'//后面还有包
else SendState:='1';//最后一个包
Temp:=Format('%s%s',[SendState,Copy(Send,i*SckMaxDataLength+1,SckMaxDataLength)]);
Socket.SendText(Temp);
end;
MemStr.Free;
end;

吃饭去也,接收端的自己写吧。
 
把文件分成几块来传送肯定可以的。
 
怎样分?举个列子
 
至rainfly:
好象用FOR语句不行吧,如果接收方接收数据时,其中有一个包没有收到,
而发送方仍然还是在继续发送,这样接收到的数据就不完整了。
 
这个吗TCP会自动重发的,这个就是TCP的窗口机制.........不会丢失数据的
我有自己写的多线程发送打文件的例子,发过200M以上的文件都没有问题,
但是代码吗只能给你单线程的,用QQ联系:775033
 
同意无忌兄的看法,我曾用该方法在2M的E1网络中传送过10M的数据,没问题!
 
用流文件也可以啊,
 
可以把源程序发一份给我吗?
我的EMAIL:kww2002@sina.com
多谢!
 
流文件我试过,很容易出错,数据容易丢失,我后来一直用文件流或者文件映射
效果都不错。
 
我给你发一个吧,刚写的,传个2、3百M没有什么问题。
 
还没有收到呀
 
我的Email:kww2002@sina.com
 
To :张无忌,
你是csdn上的那个张兄弟吗?
能说说你做共香软件的经验吗?
 
邮件系统有点问题,现在看看去。
 
大文件不做校验肯定不行了。
 
to 没理头号
我很少上CSDN,做大文件用类似FTP的办法
 
通过代理服务器Winsocket的客户端要怎样才能与服务器相连?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部