|
大家好,我写了一个TDI的驱动,采用tcp协议,这个驱动的目的主要是把数据发送到服务器。但是我奇怪的是,send的效率非常低,但是recv的效率非常高,我看到网上很多人都碰到这个问题,有没有把这个问题解决了的?大家能指点一下吗?感谢不尽!
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, irp);
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;
}
我发现主要是这个KeWaitForSingleObject等待花了很多时间,但是如果我不使用这个函数,怎么确保发送成功?成功发送了多少字节?我发现,如果我们发送一个比较大的数据的话,返回值有可能小于我们的发送长度。因为是这样的,我希望发送成功了,才发送下一个数据,我害怕这个还没有发送成功,或者只发送了一半,就开始发送下一个数据,那么整个数据都乱了,因为数据是有固定顺序的。大家有什么好的建议和意见吗?谢谢!
|
|