将IO端口绑定后为什么还要在加上重叠IO的RECV或者SEND? 如题!!!!为什么主线程需要加上RECV呢?当有消息来了以后直接在服务线程中接收不行吗?不懂啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是先有RECV,端口才会接收其他SOCKET传过来的数据和改变信号? LZ说的是IOCP么?如果一开始没有RECV是没法驱动IOCP工作的。 void CMyIOtestDlg::OnButton1() {// TODO: Add your control notification handler code hereCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);//创建端口GetSystemInfo(&SystemInfo);//获取系统信息for(i = 0; i<(SystemInfo.dwNumberOfProcessors); i++){HANDLE ThreadHandle;ThreadHandle = CreateThread(NULL, 0,ServerWorkerThread, CompletionPort,0, NULL);//创建线程CloseHandle(ThreadHandle);//关闭句柄}Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);//创建套接字InternetAddr.sin_family = AF_INET;InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);InternetAddr.sin_port = htons(9527);bind(Listen, (PSOCKADDR) &InternetAddr,sizeof(InternetAddr));//绑定套接字listen(Listen, 5);//监听套接字while(TRUE){SOCKADDR_IN saRemote;SOCKET Accept;int RemoteLen;RemoteLen = sizeof(saRemote);Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote, &RemoteLen,0,0);PER_HANDLE_DATA *PerHandleData=NULL;PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));PerHandleData->Socket = Accept;memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);if(CreateIoCompletionPort((HANDLE) Accept,CompletionPort, (DWORD) PerHandleData, 0)==NULL){closesocket(Accept);}else{PER_IO_OPERATION_DATA *p_Data=&Data;memset(p_Data,0,sizeof(PER_IO_OPERATION_DATA));p_Data->DataBuf.buf = p_Data->szBuffer;ZeroMemory(p_Data->szBuffer,sizeof(p_Data->szBuffer));DWORD RecvBytes=0;DWORD Flags=0;int nRet =WSARecv(Accept, &(p_Data->DataBuf), 1, &RecvBytes,&Flags, &(p_Data->Overlapped), NULL);if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())){//cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl;closesocket(Accept);delete p_Data;}}}return;}------------------------------------------DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID){ HANDLE CompletionPort = (HANDLE) CompletionPortID; DWORD BytesTransferred; LPOVERLAPPED Overlapped; LPPER_HANDLE_DATA PerHandleData; PER_IO_OPERATION_DATA *PerIoData; DWORD SendBytes, RecvBytes; DWORD Flags; while(TRUE) { // Wait for I/O to complete on any socket // associated with the completion port int ret = GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,(LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE);CString str;str.Format("%d",BytesTransferred);AfxMessageBox(str);-------------------……………………………………为何我向服务器发东西,进入了工作线程,然而接收数据str确实0啊???????? ?IO端口收到信息不会自动填充BytesTransferred? 那这个p_Data->DataBuf,WSABUF总得先填好再WSARecv 如何查找一个程序什么时候调用dll库 如何继承windows的鼠标类? 没人帮我解决我就跳楼了 关于VC基于TCP/IP协议通过网口和单片机通信的问题! 想通过VC++实现网页提交表单功能??? overlay如何抓图,为什么我抓不到。救我。 如何准确的得到一个窗口的左上交坐标(相对于屏幕左上角)? 当了版猪了,以后请多多关照. 一个关于Com组件的简单问题 Format 串口通信程序,在线求教 DestroyWindow 无法结束进程
{
// TODO: Add your control notification handler code here
CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);//创建端口
GetSystemInfo(&SystemInfo);//获取系统信息
for(i = 0; i<(SystemInfo.dwNumberOfProcessors); i++)
{
HANDLE ThreadHandle;
ThreadHandle = CreateThread(NULL, 0,ServerWorkerThread, CompletionPort,0, NULL);//创建线程
CloseHandle(ThreadHandle);//关闭句柄
}
Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);//创建套接字InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(9527);
bind(Listen, (PSOCKADDR) &InternetAddr,sizeof(InternetAddr));//绑定套接字
listen(Listen, 5);//监听套接字
while(TRUE)
{SOCKADDR_IN saRemote;
SOCKET Accept;
int RemoteLen;
RemoteLen = sizeof(saRemote);
Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote, &RemoteLen,0,0);
PER_HANDLE_DATA *PerHandleData=NULL;
PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
PerHandleData->Socket = Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);
if(CreateIoCompletionPort((HANDLE) Accept,CompletionPort, (DWORD) PerHandleData, 0)==NULL)
{
closesocket(Accept);
}
else
{
PER_IO_OPERATION_DATA *p_Data=&Data;
memset(p_Data,0,sizeof(PER_IO_OPERATION_DATA));
p_Data->DataBuf.buf = p_Data->szBuffer;
ZeroMemory(p_Data->szBuffer,sizeof(p_Data->szBuffer));
DWORD RecvBytes=0;
DWORD Flags=0;
int nRet =WSARecv(Accept, &(p_Data->DataBuf), 1, &RecvBytes,&Flags, &(p_Data->Overlapped), NULL);
if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()))
{
//cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl;
closesocket(Accept);
delete p_Data;
}
}
}
return;
}
------------------------------------------
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
HANDLE CompletionPort = (HANDLE) CompletionPortID;
DWORD BytesTransferred;
LPOVERLAPPED Overlapped;
LPPER_HANDLE_DATA PerHandleData;
PER_IO_OPERATION_DATA *PerIoData;
DWORD SendBytes, RecvBytes;
DWORD Flags;
while(TRUE)
{
// Wait for I/O to complete on any socket
// associated with the completion port
int ret = GetQueuedCompletionStatus(CompletionPort,
&BytesTransferred,(LPDWORD)&PerHandleData,
(LPOVERLAPPED *) &PerIoData, INFINITE);
CString str;
str.Format("%d",BytesTransferred);
AfxMessageBox(str);
-------------------……………………………………
为何我向服务器发东西,进入了工作线程,然而接收数据str确实0啊????????
那这个p_Data->DataBuf,WSABUF总得先填好再WSARecv