阅读:1784回复:6
TDI的tcp send速度问题
各位好,我正在写一个tdi的tcp通讯程序,写完以后发现速度太慢了,下面是我的代码,大家觉得应该怎么改比较好?
谢谢各位大侠了!!! NTSTATUS tdi_send_stream(PFILE_OBJECT connectionFileObject, const char *buf, int len, ULONG flags) { PDEVICE_OBJECT devObj; KEVENT event; PIRP irp; PMDL mdl; IO_STATUS_BLOCK iosb; NTSTATUS status; devObj = IoGetRelatedDeviceObject(connectionFileObject); KeInitializeEvent(&event, NotificationEvent, FALSE); irp = TdiBuildInternalDeviceControlIrp(TDI_SEND, devObj, connectionFileObject, &event, &iosb); if (irp == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } if (len) { mdl = IoAllocateMdl((void*) buf, len, FALSE, FALSE, NULL); if (mdl == NULL) { IoFreeIrp(irp); return STATUS_INSUFFICIENT_RESOURCES; } __try { MmProbeAndLockPages(mdl, KernelMode, IoReadAccess); status = STATUS_SUCCESS; } __except (EXCEPTION_EXECUTE_HANDLER) { IoFreeMdl(mdl); IoFreeIrp(irp); status = STATUS_INVALID_USER_BUFFER; } if (!NT_SUCCESS(status)) { return status; } } TdiBuildSend(irp, devObj, connectionFileObject, NULL, NULL, len ? mdl : 0, flags, len); status = IoCallDriver(devObj, irp); if (status == STATUS_PENDING) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); status = iosb.Status; } return NT_SUCCESS(status) ? iosb.Information : status; } |
|
沙发#
发布于:2007-10-11 15:52
TDI SEND很快的,send的时候不需要WAIT
|
|
|
板凳#
发布于:2007-10-11 16:47
谢谢大侠,但是我怎么处理数据同步呢,用完成例程?
引用第1楼clicx于2007-10-11 15:52发表的 : |
|
地板#
发布于:2007-10-11 21:08
TDI的发送应当是阻塞方式的,如果发送缓冲区满,而接收不及时就会停止,我觉得不能去掉
wait,这样会产生丢包,提高速度的方法应当是加速接收方的响应 |
|
地下室#
发布于:2007-10-12 09:07
你觉得应该怎么加快接收方的响应?
引用第3楼icesword于2007-10-11 21:08发表的 : |
|
5楼#
发布于:2007-10-12 18:09
这个问题比较麻烦呀,我按照clicx 大侠说的不wait,但是如果传输10K的包,对方根本就接收不到。不知道怎么处理,各位大侠能不能给点意见?谢谢先!
|
|
6楼#
发布于:2007-10-13 23:25
这个是真正需要讨论的,也比较麻烦,其中一个处理应当是接收和包处理分开,如使用两个线程
引用第4楼zealsoft_zhu于2007-10-12 09:07发表的 : |
|