to neccui(PPC): 我觉得你的说法很有问题,你凭什么说在Win98对UDP的支持不好,我从来就没有听说过! 另外对于传送文件的操作来讲,应该具体对待,如果需要传送的文件不大,完全可以使用基于UDP的tftp协议,保证实时和高效;如果传送的文件一般来讲比较大,当然使用tcp较好。
to neccui(PPC): UDP的传输效率怎么也高不过TCP了,毕竟又多了一层????????这是什么意思???????你不用过总听过吧,你觉得TCP/IP和UDP/IP这些很陌生吗?TCP和UDP都是IP所生的两兄弟(何来又多了一层?),不过TCP是慢才(慢但可靠),UDP是急才(快但不可靠). 同意nuaaliao(深蓝色的海)所说,UDP我在Dos和Window98/2000都玩过不少,现在还在玩,但我并没有注意速度问题,因为在我的应用环境(局域网)里我认为已是足够快.
[email protected]
(用的是MFC,使用CAsyncSocket类,用异步方式)
UDP.h
class CUdpComm
{
public:
UCHAR CRCTest(UCHAR* Buff,int From,int To);
BOOL Send(BYTE* buf,int size,char* addr);
CUdpComm(CWnd* pParent,
UINT nSendPort=16888,
UINT nRecvPort=16889);
virtual ~CUdpComm();
private:
UINT m_nSendPort;
UINT m_nRecvPort; CWnd* m_pParent; static UINT Thread(LPVOID pParam);
BOOL m_bContinue;
BOOL m_bExited;
};
UDP.cppCUdpComm::CUdpComm(CWnd* pParent,UINT nSendPort,UINT nRecvPort)
{
m_nSendPort=nSendPort;
m_nRecvPort=nRecvPort;
m_pParent=pParent; WSADATA wsd;
WSAStartup(0x0101,&wsd); m_bContinue=TRUE;
m_bExited=TRUE;
AfxBeginThread(Thread,(LPVOID)this);}CUdpComm::~CUdpComm()
{
// BYTE buf[11];
m_bContinue=FALSE;
/*
while(m_bExited==FALSE)
{
Send(buf,11,"127.0.0.1");
}
*/
//Sleep(500);
WSACleanup();
}BOOL CUdpComm::Send(BYTE *buf, int size,char* addr)
{
CSocket sockSend;
sockSend.Create(m_nSendPort,SOCK_DGRAM,NULL);
sockSend.Bind(m_nSendPort,addr);
int nCount;
nCount=sockSend.SendTo(buf,
size,m_nRecvPort,addr,0);
sockSend.Close();
return TRUE;
}UINT CUdpComm::Thread(LPVOID pParam)
{
CUdpComm* pThis=(CUdpComm*)pParam;
pThis->m_bExited=FALSE;
CSocket sockReceive;
BYTE buf[256];
BYTE* PostBuf; UINT Port=pThis->m_nRecvPort; sockReceive.Create(Port,SOCK_DGRAM,NULL);
sockReceive.Bind(Port,"127.0.0.1");
CString strAddr("127.0.0.1");
UINT nPort=pThis->m_nSendPort; int nCount;
while(pThis->m_bContinue==TRUE)
{
Sleep(100);
nCount=sockReceive.ReceiveFrom(buf,256,strAddr,nPort,0);
PostBuf=new BYTE[nCount];
memcpy(PostBuf,buf,nCount);
pThis->m_pParent->PostMessage(IDM_SOCK_RECEIVE_DATA,
(WPARAM)PostBuf,nCount);
}
sockReceive.Close();
pThis->m_bExited=TRUE;
return 0;
}
//每次校验2~buffersize-1字节内容,不校验55AA
UCHAR CUdpComm::CRCTest(UCHAR* Buff,int From,int To)
{
UCHAR CrcTable[] = {
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
};
int i;
UCHAR result = 0;
for(i=From;i<To;i++)
result = CrcTable[Buff[i] ^ result];
return result^0xFF;
}
[email protected]
太大。要源码的请举手
能给个源码吗?[email protected]
要多少分随便(共867分)
花钱可以吗?你开个价钱吧
急用!
要多少钱?我急用
any way, thanks!
[email protected]
而且由于实现的问题, UDP的传输效率怎么也高不过TCP了, 毕竟又多了一层。
我觉得你的说法很有问题,你凭什么说在Win98对UDP的支持不好,我从来就没有听说过!
另外对于传送文件的操作来讲,应该具体对待,如果需要传送的文件不大,完全可以使用基于UDP的tftp协议,保证实时和高效;如果传送的文件一般来讲比较大,当然使用tcp较好。
UDP的传输效率怎么也高不过TCP了,毕竟又多了一层????????这是什么意思???????你不用过总听过吧,你觉得TCP/IP和UDP/IP这些很陌生吗?TCP和UDP都是IP所生的两兄弟(何来又多了一层?),不过TCP是慢才(慢但可靠),UDP是急才(快但不可靠).
同意nuaaliao(深蓝色的海)所说,UDP我在Dos和Window98/2000都玩过不少,现在还在玩,但我并没有注意速度问题,因为在我的应用环境(局域网)里我认为已是足够快.
对于udp,由于自己要做重发乱序等等操作,传输的能力是由客户来保证的。 也就是说客户完成了传输层的操作。客户是否能完成这个任务,就难说了。
事实上tcp内部实现一定比自己写的更加完善高效。实际上,大家对于所谓的快,有理解上的不统一。快是两方面的,
一个是延时小, 这个是udp的强项
一个是带宽大,这个本来似乎也应该是udp的强项, 其实不尽然。TCP已经可达线速,UDP不可能比它再快,一旦考虑了重发问题,那可能反而不如TCP了。nuaaliao(深蓝色的海) ,你以说自己没有听说过为,这是一个好笑的理由。
但是我由于工作需要, 对于win98, 2000和linux等系统也都做过测试。 在满流量的情况下, 各个系统表现不一,相比而言windows98的表现是很差的。至于tftp,呵呵, 现在有多少人在使用呢?
对于文件传输而言,如果没有特殊的要求比如穿透防火墙、实时语音通讯之类
,tcp是最好的选择。尽量避免使用udp。logical(阿来),如果没有重发,TCP并不慢,它的延时和UDP是一样的,在良好的网络情况下,TCP的'慢'并不会有任何体现。至于传输效率,对于数据包大小的选择,何时发确认包,如何合并发送,以及各种特殊情况,TCP,系统会完成一切的。但是UDP则要自己完成,一个在以太网上效率很高的UDP程序,在ATM就可能会不适合。 总之,在能用TCP的地方最好使用TCP。
基于局域网的嘛,
用于建立与代理服务器之间连接的Socket类,支持SOCKS4/5 HTTP 1.1代理
http://www.vchelp.net/source/submit/socket_file.zip
Winsock文件传输,支持文本文件和二进制文件
别用UDP传文件!记得给分
[email protected]
thank a million!
thanks a lot!
[email protected]
例如10M的网40人共用,则每人的分得的带宽非常的低,假如又不是双工的话
就会更低了。还有如果用UDP必须有一个包排序和包检测的过程,这样可能比用TCP的实现方式更加的慢,除非你的局域网的网络状况特别的好。
如果你真的要一试的话,建议参考Radius以及RTP的实现。
而在100M网络上,只能传到40Mbits/s左右,如果你用UDP传输文件,一定要自己再在上层定义一套协议,才能做到可靠传输,用MultiCast(组播)传输,因为涉及到多人接收,不可能再定义一套协议来做到可靠传输.UDP与multicast都是边界保护的,所以接收端比较好处理.用TCP一定能做到可靠传输,但它对流边界不进行保护,如果在网络状况良好的情况下,用UDP,multicast,TCP效率都差不多,但在网络不好的情况下,TCP重传的概率很大,UDP与multicast出错概率也大.
我现在很关心一个技术:可以把Windows网络属性中的所有协议删除,
仍然能实现局域网中数据的可靠传输。我曾见过别人做的程序。但一
直没有能实现。我愿高分悬赏。
顺便说:使用tcp,在有些场合和为难,比如说学校机房,很多是没有
配置IP地址的。也未必上网。我想在这个局域网中传送无纸化考试的
成绩,如何实现?或我想做电子教鞭类的程序,需要广播某台机器的
所有屏幕内容,如何实现?
[email protected]
需要请:[email protected]
UDP 〉8M字节/每秒 64M位/秒
TCP 〉8M字节/秒 64M位/秒
其实UDP/TCP差不多少
intel pro100B 网卡
1G K7处理器
256M 内存
C++Builder 5.0
用Delphi,很容易实现的。
[email protected]
tcp又要求公共机房的每台机器都得配置IP地址。可实际上,一般的公共机
房都是先作好一个硬盘,在Ghost,因此指定固定IP地址不太现实。而且我
也试过使用DHCP动态获取IP地址。可我的数据(比如成绩)传给谁?传到
那台机器?而且我试过让一台机器的IP地址固定,其余采用动态获取IP,
结果发现根本就不能连接socket(不知何故)。还有就是得考虑,如果别人没有安装你所用的协议,如何解决?因此,我倾向自己编个小协议,反正我只要传送数据量不大的数据。
[email protected]
源程序不是问题,这个很简单!
但是面向对象开发需要的是能利用现有的资源,而不是自己开发!这个很重要。我不推荐用socket传输文件,因为这么做与面向对象的精神不符,与软件重用格格不入。我推荐的是用BCB自带的文件发送控件组。indy组和netmaster组都有提供。另外可选的还有Corba和DCOM。
用Socket
TCustomSocket发送用SendBuf可以一次发送2G字节,因此可以一次发送一个文件,接收一次一般只能接受8K字节,因此需要将收到的字节拼接起来。
代码不复杂,我觉得不必贴出来。但是强烈建议不用Socket
你用VC?
是啊是啊
关于用VC开发UDP文件传输,很简单。外面到处都有这样的书。你随便找本书得啦。关键是做一个实用、可靠的
我没有说不可以
只是你要做到可靠传输,花销的代价比TCP做的还要大
又何苦呢,为什么不干脆用TCP?
如果呢需要同时给很多人,那么可以用IGMP啊,为什么要用UDP?
我没有用过IGMP,能指点一二吗?感激不尽!至于“只是你要做到可靠传输,花销的代价比TCP做的还要大”就未必了。
因为我要传送的数据量不大,也不要总是建立连接在哪里。几十个字节
一次,而且次数也不多。