通信上了接收不到数据!

clown 2009-11-15 01:20:05
实现个远程注销功能 初学IOCP想试试 通信成功了 但接收数据好象收不到 点完注销按钮没反映,找不出什么毛病
烦劳高手慧眼识错 感激不尽

服务端IOCP模型
#include <Winsock2.h>
#include <iostream.h>
#define BUFFER_SIZE 1024

typedef struct _PER_HANDLE_DATA
{
SOCKET s;
sockaddr_in addr;
}PER_HANDLE_DATA,*PPER_HANDLE_DATA;

typedef struct _PER_IO_DATA
{
OVERLAPPED ol;
char buf[BUFFER_SIZE];
int nOperationType;
#define OP_READ 1
#define OP_WRITE 2
#define OP_ACCEPT 3
}PER_IO_DATA,*PPER_IO_DATA;

char *ID="PowerOff";
DWORD WINAPI ServerTheard(LPVOID lpParam);

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}


if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
HANDLE hCompletion=CreateIoCompletionPort(INVALID_HANDLE_VALUE,0,0,0);
CreateThread(NULL,0,ServerTheard,(LPVOID)hCompletion,0,0);


SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(12345);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

while(1)
{

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
PPER_HANDLE_DATA pHandle=(PPER_HANDLE_DATA)GlobalAlloc(GPTR,sizeof(PPER_HANDLE_DATA));
pHandle->s=sockConn;
memcpy(&pHandle->addr,&addrClient,len);
CreateIoCompletionPort((HANDLE)pHandle->s,hCompletion,(DWORD)pHandle,0);

PPER_IO_DATA pIo=(PPER_IO_DATA)GlobalAlloc(GPTR,sizeof(PPER_IO_DATA));
pIo->nOperationType=OP_READ;

WSABUF buf;
buf.buf=pIo->buf;
buf.len=BUFFER_SIZE;
DWORD dwRecv;
DWORD dwFlags=0;
WSARecv(pHandle->s,&buf,1,&dwRecv,&dwFlags,&pIo->ol,NULL);

}
}



DWORD WINAPI ServerTheard(LPVOID lpParam)
{
HANDLE hCompletion=(HANDLE)lpParam;
DWORD dwTrans;
PPER_HANDLE_DATA pHandle;
PPER_IO_DATA pIo;

while (TRUE)
{
BOOL bOK=GetQueuedCompletionStatus(hCompletion,&dwTrans
,(LPDWORD)&pHandle,(LPOVERLAPPED*)&pIo,WSA_INFINITE);
if (!bOK)
{
closesocket(pHandle->s);
GlobalFree(pHandle);
GlobalFree(pIo);
continue;
}
if (dwTrans==0&&(pIo->nOperationType==OP_READ||pIo->nOperationType==OP_WRITE))
{
closesocket(pHandle->s);
GlobalFree(pHandle);
GlobalFree(pIo);
continue;
}
switch(pIo->nOperationType)
{
case OP_READ:
{

if (ID==pIo->buf)
{
ExitWindowsEx(EWX_LOGOFF,0); //就是实现个远程注销功能
}
WSABUF buf;
buf.buf=pIo->buf;
buf.len=BUFFER_SIZE;
DWORD dwRecv;
DWORD dwFlags=0;
WSARecv(pHandle->s,&buf,1,&dwRecv,&dwFlags,&pIo->ol,NULL);
}
break;
case OP_WRITE:
break;
case OP_ACCEPT:
break;

}
}
return 0;
}

客户端:

char *ID="PowerOff";
void CPowerOffDlg::OnBtnPoweroff()
{
// TODO: Add your control notification handler code here
send(m_sock,ID,strlen(ID)+1,0);

}
...全文
174 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
clown 2009-11-18
  • 打赏
  • 举报
回复
自己顶
clown 2009-11-17
  • 打赏
  • 举报
回复
哪位高手 能指点一下啊!不要沉了啊
lvchun012 2009-11-16
  • 打赏
  • 举报
回复
呵呵,GetQueuedCompletionStatus记得用两次啊,一次创建一次关联啊,别忘记了
clown 2009-11-16
  • 打赏
  • 举报
回复
哪位高手 能指点一下啊!不要沉了啊
nanhaochen 2009-11-15
  • 打赏
  • 举报
回复
哦,明白了,GetQueuedCompletionStatus就相当于关联起来了,呵呵,
nanhaochen 2009-11-15
  • 打赏
  • 举报
回复
楼主代码中创建的线程时如何跟你创建的完成端口关联起来的?
clown 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 arpnet99 的回复:]
引用楼主:
但接收数据好象收不到

确定数据能不能收到?
不要好像。
关机是需要权限的,注销是不是也需要呢?
注销就不是很清楚....
[/Quote]

case OP_READ:
{
cout<<pIo->buf<<endl; //新加这段代码 按完按钮没有显示 看来数据没有传过来 哪位高人瞧瞧啊 迷茫啊!
if(strncmp(ID,pIo->buf,BUFFER_SIZE)==0)
{
ExitWindowsEx(EWX_LOGOFF,0);
}
else
cout<<"失败";
clown 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 arpnet99 的回复:]
引用楼主:
但接收数据好象收不到

确定数据能不能收到?
不要好像。
关机是需要权限的,注销是不是也需要呢?
注销就不是很清楚....
[/Quote]
注销不需要权限
这不是鸭头 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用楼主:]
但接收数据好象收不到
[/Quote]
确定数据能不能收到?
不要好像。
关机是需要权限的,注销是不是也需要呢?
注销就不是很清楚....
whs1980 2009-11-15
  • 打赏
  • 举报
回复
if(strcmp(ID,Pio->Buf)==0) 改成
if(strncmp(ID,pIo->buf,BUFFER_SIZE)==0)
clown 2009-11-15
  • 打赏
  • 举报
回复
大哥 你QQ多少加你吧
whs1980 2009-11-15
  • 打赏
  • 举报
回复
whs_ben@qq.com
clown 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 whs1980 的回复:]
BUFFER_SIZE 1024
不是没有收到数据,是你的BUFFER SIZE设置的太大了,IOCP需要把你这一块内存都填满了再返回.
你只设置成8的大小,再试试看
[/Quote]
不行啊 大哥 你有邮箱吗 帮我调试一下吧
whs1980 2009-11-15
  • 打赏
  • 举报
回复
BUFFER_SIZE 1024
不是没有收到数据,是你的BUFFER SIZE设置的太大了,IOCP需要把你这一块内存都填满了再返回.
你只设置成8的大小,再试试看
clown 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 whs1980 的回复:]
得你自己调试一下服务器端,看看到底有没有接收到消息
[/Quote]
连接成功了 发送数据 服务端没有收到!郁闷
whs1980 2009-11-15
  • 打赏
  • 举报
回复
得你自己调试一下服务器端,看看到底有没有接收到消息
clown 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 whs1980 的回复:]
错了,用下面的:
if(strcmp(ID,Pio->Buf)==0)
[/Quote]
不行啊 点完按钮还是没反映
whs1980 2009-11-15
  • 打赏
  • 举报
回复
错了,用下面的:
if(strcmp(ID,Pio->Buf)==0)
whs1980 2009-11-15
  • 打赏
  • 举报
回复
if (ID==pIo->buf)
不能用这种方式来比较吧,用下面的试试
if(strcmp(ID,Pio->Buf))

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧