一个重叠I/O套接字的问题
pf_ma 2001-09-26 09:57:41 我现在正在试 重叠I/O套接字的完成例程
但我的实验程序好象有问题,那位大虾能帮我看看
程序运行到 WSARecv,提示 重叠I/O初始化成功,
但客户端Send之后,并没有调用 完成例程,请问为什么?
附上源代码
//**********************************************
#include <winsock2.h>
#include <stdio.h>
typedef struct
{
WSAOVERLAPPED wol;
SOCKET s;
CHAR buf[100];
WSABUF wbuf;
DWORD dwc;
}OLX;
VOID CALLBACK cr(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags);
DWORD rlen;
DWORD flag = 0;
VOID main()
{
WSADATA wd;
WSAStartup(0x0202, &wd);
CHAR hostname[512];
gethostname(hostname, 512);
HOSTENT * pht = gethostbyname(hostname);
printf("Server IP:%s\n", inet_ntoa(*(IN_ADDR *)(pht->h_addr_list[0])));
SOCKET ls = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ls != INVALID_SOCKET) printf("socket ok...\n");
SOCKADDR_IN saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.S_un.S_addr = 0;
saddr.sin_port = htons(5050);
INT irv = bind(ls, (SOCKADDR *)&saddr, sizeof(SOCKADDR));
if (irv != SOCKET_ERROR) printf("bind ok...\n");
irv = listen(ls, 5);
if (irv != SOCKET_ERROR) printf("listen ok...\n");
DWORD dwrv = 1;
irv = ioctlsocket(ls, FIONBIO, &dwrv);
if (irv != SOCKET_ERROR) printf("ioctlsocket ok...\n");
printf("\n");
while(1)
{
SOCKET s = accept(ls, NULL, NULL);
if (s != INVALID_SOCKET)
{
printf("\naccept ok...\n");
OLX * polx = new OLX;
memset(polx, 0, sizeof(OLX));
polx->s = s;
polx->wbuf.buf = polx->buf;
polx->wbuf.len = 100;
INT irv = WSARecv(s, &(polx->wbuf), 1, &rlen, &flag, &(polx->wol), cr);
if (irv == 0) printf("\nWSARecv ok...\n");
if (WSAGetLastError() == WSA_IO_PENDING) printf("\nWSARecv WSA_IO_PENDING...\n");
}
Sleep(10);
}
closesocket(ls);
WSACleanup();
}
VOID CALLBACK cr(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags)
{
printf("call back ...");
OLX * polx = (OLX *)lpOverlapped;
INT irv = WSARecv(polx->s, &(polx->wbuf), 1, &rlen, &flag, &(polx->wol), crzzzz);
printf(".");
}
//**********************************************