My IOCP client code has some errors, help me.
#include <winsock2.h>
#include <mswsock.h>
#include <process.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"mswsock.lib")
struct IODATA
{
OVERLAPPED ol;
DWORD op;
SOCKET s;
HANDLE hIocp;
};
#define CONNCHECKDATA "hello0123456"
int main(int argc, char* argv[])
{
int ret=0;
DWORD bytes=0;
WSADATA data={0};
static LPFN_CONNECTEX lpfnConnectEx=NULL;
int iRet=WSAStartup(0x0202,&data);
HANDLE hIocp=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
IODATA io={0};
io.s=socket(AF_INET,SOCK_STREAM,0);
io.op=FD_CONNECT;
io.hIocp=hIocp;
SOCKADDR_IN lAddr,rAddr;
lAddr.sin_family=AF_INET;
lAddr.sin_port=INADDR_ANY;
lAddr.sin_addr.s_addr = INADDR_ANY;
rAddr.sin_family=AF_INET;
rAddr.sin_port=htons(4567);
rAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ret=bind(io.s,(SOCKADDR*)&lAddr,sizeof(lAddr));
CreateIoCompletionPort((HANDLE)io.s,hIocp,(ULONG_PTR)&io,0);
if(NULL==lpfnConnectEx)
{
GUID guid=WSAID_CONNECTEX;
ret=WSAIoctl(io.s,SIO_GET_EXTENSION_FUNCTION_POINTER,&guid,sizeof(guid),&lpfnConnectEx,sizeof(lpfnConnectEx),&bytes,NULL,NULL);
}
printf("connecting...\n");
char SendBuffer[4096]={0};
char* pMask = (char*)SendBuffer;
*pMask=128;
strcpy(pMask+3,CONNCHECKDATA);
*(WORD*)(pMask+1) = strlen(CONNCHECKDATA)+1;
ret=lpfnConnectEx(io.s,(SOCKADDR*)&rAddr,sizeof(rAddr),SendBuffer,*(WORD*)(pMask+1) + 3,&bytes,&io.ol);
DWORD dwTick=GetTickCount();
while(1)
{
IODATA* pio=NULL;
LPOVERLAPPED pol=NULL;
ret = ::GetQueuedCompletionStatus(hIocp,&bytes,(PULONG_PTR)&pio,&pol,WSA_INFINITE);
printf("GQCS returned --- ");
if(!pio)
{
printf("GQCS timeout.closesocket[socket=%d] -%d\n",io.s,GetTickCount()-dwTick);
if(ret==0)
{
shutdown(io.s,SD_BOTH);
closesocket(io.s);
}
}
else
{
if(pio->op==FD_CONNECT)
{
if(ret)
{
printf("connect OK, recving[socket=%d]...\n",pio->s);
WSABUF wb;
wb.buf=new char[4096];
char* pMask = (char*)wb.buf;
*pMask=128;
strcpy(wb.buf+3,"测试数据abcd...");
*(WORD*)(pMask+1) = strlen("测试数据abcd...")+1;
wb.len=*(WORD*)(pMask+1)+3;
pio->op = FD_WRITE;
ret=WSASend(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
if (ret!=0)
{
printf("rev err:%d\n",WSAGetLastError());
}
IODATA *pRevIo = new IODATA;
pRevIo->hIocp=hIocp;
pRevIo->op = FD_READ;
pRevIo->ol = pio->ol;
DWORD dwFlags = 0;
wb.buf=new char[1024];
wb.len=1024;
dwFlags = 0;
ZeroMemory(&(pio->ol), sizeof(OVERLAPPED));
pio->op = FD_READ;
ret = WSARecv(pio->s, &wb, 1, &bytes, &dwFlags, &(pio->ol), NULL);
if (ret!=0)
{
if(::WSAGetLastError() != WSA_IO_PENDING)
{
printf("rev err:%d\n",WSAGetLastError());
}
}
continue;
}
else
{
printf("%s[%d] failed %d\n",pio->op==FD_CONNECT ? "Connect" : "Recv",pio->s,WSAGetLastError());
break;
}
}
else if(pio->op=FD_READ)
{
printf("printf returned[%d]\n",bytes);
continue;
}
else if (pio->op=FD_WRITE)
{
WSABUF wb;
wb.buf=new char[4096];
char* pMask = (char*)wb.buf;
*pMask=128;
strcpy(wb.buf+3,CONNCHECKDATA);
*(WORD*)(pMask+1) = strlen(CONNCHECKDATA)+1;
wb.len=*(WORD*)(pMask+1)+3;
pio->op = FD_WRITE;
ret=WSASend(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
continue;
}
}
}
system("pause");
return 0;
}