Click here to Skip to main content
15,886,760 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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;
	//char *buff;				// I/O操作使用的缓冲区
	//int nLen;				// buff缓冲区(使用的)大小
};
#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);
	}
	//    _beginthreadex(NULL,0,_IoHandle,&io,0,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);
	/*
	BOOL bResult = m_lpfnConnectEx (m_sockClient , 
		(sockaddr *)&addrPeer ,  // [in] 对方地址 
		nLen ,               // [in] 对方地址长度 
		lpSendBuffer ,       // [in] 连接后要发送的内容,这里不用 
		dwSendDataLength ,   // [in] 发送内容的字节数 ,这里不用 
		&dwBytesSent ,       // [out] 发送了多少个字节,这里不用 
		(OVERLAPPED *)pmyoverlapped ); // [in] 这东西复杂,下一篇有详解 
		*/

	DWORD dwTick=GetTickCount();
	while(1)
	{
		IODATA* pio=NULL;
		LPOVERLAPPED pol=NULL;
		//ret=GetQueuedCompletionStatus(hIocp,&bytes,(PULONG_PTR)&pio,&pol,1000);
		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());
 					}
// 					ret=WSASend(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
// 					if (ret!=0)
// 					{
// 						printf("rev err:%d\n",WSAGetLastError());
// 					}
//WSA_IO_PENDING
					IODATA *pRevIo = new IODATA;
					pRevIo->hIocp=hIocp;
					pRevIo->op = FD_READ;
					pRevIo->ol = pio->ol;
					DWORD dwFlags = 0;
					//WSABUF wb;
					wb.buf=new char[1024];
					wb.len=1024;
					
// 					ret=WSARecv(pio->s,&wb,1,&bytes,&Flags,&pRevIo->ol ,NULL);
// 					if (ret!=0)
// 					{
// 						printf("rev err:%d\n",WSAGetLastError());
// 					}

					dwFlags = 0;
					// Set up the per-I/O operation data for the next
					// overlapped call
					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_READ;
				//ret=WSARecv(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
				pio->op = FD_WRITE;
				ret=WSASend(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
				continue;
			}
		}
	}
	system("pause");
	return 0;
}
Posted
Updated 7-Jun-10 23:02pm
v2
Comments
Moak 8-Jun-10 5:05am    
Updated subject, text, formatting. Maybe you can tell what problems you have. Hope this helps.
henry3695 8-Jun-10 6:06am    
else if(pio->op=FD_READ)

OH NO !

== write =

wrong!

You have memory leaks in 4 places. Search for 'new' and then search for 'delete'.

Did I win?
 
Share this answer
 
v2
Comments
henry3695 8-Jun-10 6:07am    
pio->op = FD_WRITE;
ret=WSASend(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
if (ret!=0)
{
printf("rev err:%d
",WSAGetLastError());
}
// ret=WSASend(pio->s,&wb,1,&bytes,0,&pio->ol,NULL);
// if (ret!=0)
// {
// printf("rev err:%d
",WSAGetLastError());
// }


when i did this
oh I am so surprise

why i have not use WSARecv
but it will have

pio->op=FD_READ
Well, if you don't specify which problem you are having exactly, nobody will try to guess what it is. Furthermore, try to post only relevant code snippet, otherwise lot of people will simply not read all your code (there's just too much there).
Did you try to use your debugger to narrow down the problem ?
 
Share this answer
 
Please send this application to modify the perfect

I am a Chinese thank you very much
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900