WSARecv

Luo_Bryant 2013-04-06 11:55:59
#include <Winsock2.h>
#include <stdio.h>

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;
}


SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4567);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

WSABUF wsabuf;
wsabuf.buf = new char[200];
wsabuf.len = 200;
DWORD dwRead;
DWORD dwFlag = 0;

WSARecv(sockClient,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL);

send(sockClient,"This is lisi",strlen("This is lisi"),0);

closesocket(sockClient);
WSACleanup();
}




这是客户端,服务端采用WSAEventSelect模型,不过服务端是接收不到 This is lisi(客户端发送) 的,然而我把这句 WSARecv(sockClient,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL);注释掉的话,服务端就可以接收得到数据了,这是什么情况呀???
...全文
222 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Luo_Bryant 2013-04-07
  • 打赏
  • 举报
回复
呵呵。。。我用ioctlsocket设置为非阻塞了
杀意已决 2013-04-07
  • 打赏
  • 举报
回复
引用 8 楼 luoshao20120430 的回复:
引用 7 楼 boxmanstan 的回复: 你可以去看看socket的阻塞模式和非阻塞模式.开一个线程多方便 我现在想知道怎么设置非阻塞呀,请教。。。
你自己不去看,给你说了,设置完还得对WSARecv进行处理,叫你开线程你不听,懒猪
Luo_Bryant 2013-04-07
  • 打赏
  • 举报
回复
引用 7 楼 boxmanstan 的回复:
你可以去看看socket的阻塞模式和非阻塞模式.开一个线程多方便
我现在想知道怎么设置非阻塞呀,请教。。。
杀意已决 2013-04-07
  • 打赏
  • 举报
回复
你可以去看看socket的阻塞模式和非阻塞模式.开一个线程多方便
Luo_Bryant 2013-04-07
  • 打赏
  • 举报
回复
引用 5 楼 boxmanstan 的回复:
默认是阻塞的,你可以设置非阻塞或者开一个线程执行WSARecv
怎么设置非阻塞???
杀意已决 2013-04-07
  • 打赏
  • 举报
回复
默认是阻塞的,你可以设置非阻塞或者开一个线程执行WSARecv
Luo_Bryant 2013-04-07
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
WSARecv阻塞了等待服务器端的发送数据
可是WSARecv不是非阻塞的么?不管服务端有没有数据发送过来,WSARecv也会立即返回的呀 ,不是吗?? 求详细指点的。。。
Eleven 2013-04-07
  • 打赏
  • 举报
回复
WSARecv阻塞了等待服务器端的发送数据
wwwhhb4002 2013-04-07
  • 打赏
  • 举报
回复
这是个好问题,同求答案
Luo_Bryant 2013-04-06
  • 打赏
  • 举报
回复
WSARecv不是非阻塞的么?不管服务端有没有数据到来,WSARecv也会立即返回的呀 ,不是吗??
重叠IO模型之OverLapped完成例程模型WSACompletionRoutineServer VS2010 基础入门 客户端与服务器端 客户端向服务器端发送数据 可接收多个客户端 #include #include #pragma comment (lib, "ws2_32.lib") #define PORT 8088 #define MSG_SIZE 1024 SOCKET g_sConnect; bool g_bConnect = false; typedef struct { WSAOVERLAPPED overLap; WSABUF wsaBuf; char chMsg[MSG_SIZE]; DWORD nRecvNum; DWORD nFlags; SOCKET sClient; }PRE_IO_OPERATION_DATA, *LP_PER_IO_OPERATION_DATA; void CALLBACK CompletionRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED lpOverlap, DWORD nFlags); DWORD WINAPI workThread(LPVOID lp) { LP_PER_IO_OPERATION_DATA lpData; while(TRUE) { if (g_bConnect) // 有新的连接 { // 为lpData分配空间并初始化 lpData = (LP_PER_IO_OPERATION_DATA)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PRE_IO_OPERATION_DATA)); lpData->wsaBuf.len = MSG_SIZE; lpData->wsaBuf.buf = lpData->chMsg; lpData->sClient = g_sConnect; WSARecv(lpData->sClient, &lpData->wsaBuf, 1, &lpData->nRecvNum, &lpData->nFlags, &lpData->overLap, CompletionRoutine); g_bConnect = false; // 处理完毕 } SleepEx(1000, TRUE); } return 0; } // 系统在WSARecv收到信息后,自动调用此函数,并传入参数--回调函数 void CALLBACK CompletionRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED lpOverlap, DWORD nFlags) { LP_PER_IO_OPERATION_DATA lpData = (LP_PER_IO_OPERATION_DATA)lpOverlap; if (0 != dwError) // 接收失败 { printf("Socket %d Close!\n", lpData->sClient); closesocket(lpData->sClient); HeapFree(GetProcessHeap(), 0, lpData); } else // 接收成功 { lpData->chMsg[dwTrans] = '\0'; send(lpData->sClient, lpData->chMsg, dwTrans, 0); printf("Socket:%d MSG: %s \n", lpData->sClient, lpData->chMsg); memset(&lpData->overLap, 0, sizeof(WSAOVERLAPPED)); lpData->wsaBuf.len = MSG_SIZE; lpData->wsaBuf.buf = lpData->chMsg; // 继续接收来自客户端的数据 实现 WSARecv与CompletionRoutine循环 WSARecv(lpData->sClient, &lpData->wsaBuf,1, &lpData->nRecvNum, &lpData->nFlags, &lpData->overLap, CompletionRoutine); } } int main() { WSADATA wsaData; WSAStartup(0x0202, &wsaData); SOCKET sListen; sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in addrListen; addrListen.sin_family = AF_INET; addrListen.sin_port = htons(PORT); addrListen.sin_addr.S_un.S_addr = htonl(ADDR_ANY); int nErrorCode = 0; nErrorCode = bind(sListen, (sockaddr*)&addrListen, sizeof(sockaddr)); nErrorCode = listen(sListen, 5); DWORD nThreadID; CreateThread(NULL, 0, workThread, NULL, 0, &nThreadID); sockaddr_in addrConnect; int nAddrLen = sizeof(sockaddr_in); printf("Server Started!\n"); while(TRUE) { g_sConnect= accept(sListen, (sockaddr*)&addrConnect, &nAddrLen); if (INVALID_SOCKET == g_sConnect) { return -1; } g_bConnect = true; // 连接成功 printf("Accept Client :%s -- PORT:%d\n", inet_ntoa(addrConnect.sin_addr), htons(addrConnect.sin_port)); } return 0; }
封包助手(PackAssist)自述文件



一、软件介绍

封包助手是一个能拦截网络应用程序数据包的纯绿色软件(压缩包不足400KB,无插件无病毒,不需安装),包括Send,Recv,WSASend,WSARecv,SendTo,RecvFrom,WSASendTo,WSARecvFrom。

封包助手还可以拦截Connect和Accept函数,使您能够知道您的网络程序何去何从。

封包助手也可以发送数据,并且支持繁杂的队列发送数据,使您调试网络程序更方便。

封包助手还支持算法接口,您可以自己编写算法(压缩包内有例程源代码),封包助手就可以加载,使您分析网络数据更加方便。



二、What's New

2008.3.6(VER:0.6 Beta Build 0306)

1、调整发送数据包的代码,使发送数据包稳定

2、修正界面快捷键冲突问题

3、修正发送队列导出文件错误问题


2007.12.06(VER:0.5 Beta Build 1206)

1、去掉拦截WSAConnect和WSAAccept功能(因这两个Api最后也是调用的Winsock1.0函数,故取消)

2、增加队列发送功能(可以发多包,且可以设置时间间隔,从文件读取内容)

3、增加快捷键启动,停止截包功能(可设置快捷键)

4、增加数据查找功能(Hex和Ascii均可查找)

5、发送数据界面调整

6、发送数据更准确,更快

7、修正一处指针引起的访问错误


2007.12.02(VER:0.4 Beta Build 1202)

1、不同颜色显示不同函数(可选)

2、列表自动下滚(可选)

3、不需双击查看数据包

4、关闭进程同时停止截包

5、发送数据窗口弹出方式改变

6、优化了窗口界面


2007.11.30(VER:0.3 Beta Build 1130)

1、重写内核,代码效率更高,更稳定

2、修正Hook出错导致截包失败的问题

3、修正过滤函数的错误

4、增加拦截Connect,Accept,WSAConnect,WSAAccept的功能(Connect类函数为连接函数,故不能取到自己的ip和端口)

5、增加Toolbar,方便使用

6、增加自动开缓冲功能(普通模式在一些特殊应用网络数据量很大时,列表内的数据可能会丢失,此功能可避免此问题)


2006.4.6(VER:0.2 Beta Build 0406)

1、修正了Winsock1.0中的个别函数数据大小拦截错误的问题

2、修正了右键菜单发送数据错误的问题

3、增加了新开端口发送功能

4、调整了保存数据包的格式


2006.2.14(VER:0.1 Beta Build 0214)

1、第一发布版本,希望大家支持。。。



三、软件特点:

1、可拦截winsock2中所有发送接收函数
(如:send,recv,sendto,recvfrom,WSASend,WSARecv,WSASendTo,WSARecvFrom)

2、可拦截Connect,Accept,使您知道目标程序何去何从

3、可以发送数据

4、拦截准确,快速(不会出现丢包现象)

5、即时注入,方便快捷

6、无安装文件,解压缩即可使用

7、体积小巧(压缩包300KB)

8、支持算法导入,并且接口公开



四、使用方法:

1、打开软件,点击系统菜单中的打开进程

2、选中进程名称,点击确定

3、您已经可以对指定程序进行数据包拦截操作了

4、不拦截时,可以点击工具条的停止截包



五、注意事项:

1、本程序不得用于非法开发,谢谢合作

2、对于某杀软对本人的软件报毒一事,我不想做何解释,只能惊叹于其引擎的能力(见壳就报就算厉害了?)



2008.3.6
Written By Guozidi(郭子迪)
http://www.guozidi.cn
guozidi@gmail.com

18,358

社区成员

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

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