首页
社区
课程
招聘
关于完成端口
发表于: 2006-4-7 13:47 4677

关于完成端口

2006-4-7 13:47
4677
DWORD WINAPI ServerWorkerThread(LPVOID lpParameter)
{
        HANDLE ComplectionPort = (HANDLE)lpParameter;

        PER_IO_OPERATION_DATA *PerIOData;
        PER_HANDLE_DATA *PerHandleData;

        DWORD BytesTransferred;
        DWORD SendBytes;
        DWORD RecvBytes;
        while(TRUE)
        {
                GetQueuedCompletionStatus(ComplectionPort,&BytesTransferred,(LPDWORD)&PerHandleData,(LPOVERLAPPED*)&PerIOData,INFINITE);

                if(BytesTransferred == 0)
                {
                        printf("%d 连接关闭\n",PerHandleData->Socket);
                        closesocket(PerHandleData->Socket);

                        GlobalFree(PerHandleData);
                        GlobalFree(PerIOData);

                        continue;
                }

                switch(PerIOData->IOOperation)
                {
                case IORead:
                        {
                                //PerIOData->DATABuf.buf = PerIOData->DATABuf.buf;
                                PerIOData->DATABuf.len = BytesTransferred;
                                PerIOData->SendBytes = BytesTransferred;

                                PerIOData->IOOperation = IOWrite;

                                WSASend(PerHandleData->Socket,&PerIOData->DATABuf,1,&SendBytes,0,&PerIOData->OVerlapped,NULL);
                                break;
                        }
                case IOWrite:
                        {
                                ZeroMemory(&PerIOData->OVerlapped,sizeof(PerIOData->OVerlapped));

                                PerIOData->DATABuf.buf = PerIOData->DATABuf.buf + PerIOData->SendBytes;
                                PerIOData->DATABuf.len -= PerIOData->SendBytes;

                                if (PerIOData->DATABuf.len != 0)
                                {
                                        WSASend(PerHandleData->Socket,&PerIOData->DATABuf,1,&SendBytes,0,&PerIOData->OVerlapped,NULL);
                                        break;
                                }

                                PerIOData->DATABuf.buf = PerIOData->Buffer;
                                PerIOData->DATABuf.len = sizeof(PerIOData->Buffer);

                                PerIOData->IOOperation = IORead;

                                DWORD Flags = 0;

                                WSARecv(PerHandleData->Socket,&PerIOData->DATABuf,1,&RecvBytes,&Flags,&PerIOData->OVerlapped,NULL);
                        }
                default:
                        {
                                Sleep(1);
                        }
                }
        }

        return 0;
}

这个是工作线程~~~
测试没有问题~~~模仿例子,自己改的~~

但是我觉得会存在一个问题~~
就是说,如果调用WSASend发送数据之后,有可能数据发送不完整,可能需要多次发送~~

如果发送了第一次之后,另外一个socket收到了数据,这个时候,就可能会覆盖到WSASend的数据,从而导致第二次的发送失败~~~

有可能存在这个问题吗?

应该如何修改~~~~・

请各位帮帮忙~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 149
活跃值: (344)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
TCP应该没有问题...
2006-4-7 17:36
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
3
不会存在...
2006-4-7 18:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以看windows网络编程这本书
2006-4-8 00:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谁有windows网络编程(第二版)这本书的中文版,网上很容易找到英文版
2006-7-24 11:13
0
雪    币: 10
活跃值: (130)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
当你使用WSASend发送一个buffer后,默认会把这个Buffer的内存先锁定,再复制一份到TCP协议栈的缓存,然后解除锁定,异步返回。具体发送工作由下层的TCP协议栈负责(不论是几次才发送完)。发送完(不论是几次)就会在完成端口发送个消息,通知“操作已完成”。
2006-7-24 20:49
0
游客
登录 | 注册 方可回帖
返回
//