抓包工具已经看到数据到本机,但是recvfrom 读不到数据的问题?

jdzfjfhnui 2012-07-10 05:21:11

#include "stdafx.h"
#include <WinSock2.h>
#include <MSWSock.h>
#pragma comment(lib, "ws2_32.lib")
#include <list>
#include <vector>
#include <string>
#include <iostream>

DWORD WINAPI EchoProc(LPVOID pVoid)
{
SOCKET ReceivingSocket = (SOCKET)pVoid;
char szRecvBuf[8193]={0};
sockaddr_in SenderAddr;
int nAddrLen = sizeof(SenderAddr);
int nRecvdBytes = 0;
int Ret = 0;
while(true)
{
if((nRecvdBytes = recvfrom(ReceivingSocket, szRecvBuf, 8192, 0, (sockaddr*)&SenderAddr, &nAddrLen)) == SOCKET_ERROR)
{
cout<<"ERROR: recvfrom failed with error: " <<WSAGetLastError() <<endl;
break;
}
else
{
szRecvBuf[nRecvdBytes] = 0;
cout<<szRecvBuf<<endl;
}

Ret = sendto(ReceivingSocket, szRecvBuf, nRecvdBytes, 0, (SOCKADDR *)&SenderAddr, nAddrLen);
if(SOCKET_ERROR == Ret)
{
cout<<"ERROR: sendto failed with error: " <<WSAGetLastError() <<endl;
break;
}
}

closesocket(ReceivingSocket);
WSACleanup();

return 0;
}


DWORD WINAPI RecvProc(LPVOID pVoid)
{
SOCKET ReceivingSocket = (SOCKET)pVoid;
char szRecvBuf[8193]={0};
sockaddr_in SenderAddr;
int nAddrLen = sizeof(SenderAddr);
int nRecvdBytes = 0;
int Ret = 0;
while(true)
{
if((nRecvdBytes = recvfrom(ReceivingSocket, szRecvBuf, 8192, 0, (sockaddr*)&SenderAddr, &nAddrLen)) == SOCKET_ERROR)
{
cout<<"ERROR: recvfrom failed with error: " <<WSAGetLastError() <<endl;
break;
}
else
{
szRecvBuf[nRecvdBytes] = 0;
cout<<szRecvBuf<<endl;
}
}

closesocket(ReceivingSocket);
WSACleanup();

return 0;
}


SOCKET sock = INVALID_SOCKET;
int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
sockaddr_in sockaddr;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP );
BOOL bNewBehavior = FALSE;
DWORD dwBytesReturned;
WSAIoctl(sock, SIO_UDP_CONNRESET, &bNewBehavior, sizeof bNewBehavior, NULL, 0, &dwBytesReturned, NULL, NULL);

int mode = 0;
SELECT_MODE:
cout << "输入模式:0服务端 1客户端" << endl;
cin>>mode;
if (mode == 0)
{
int port = 0;
cout << "输入监听端口" << endl;
cin>>port;

sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
sockaddr.sin_addr.S_un.S_addr = htons(INADDR_ANY);

if(bind(sock, (SOCKADDR*)&sockaddr, sizeof(sockaddr)) != SOCKET_ERROR)
{
HANDLE hThread = CreateThread(NULL, 0, EchoProc, (void*)sock, 0, NULL);
char q = 0;
while (true)
{
cout<<"press q to quit"<<endl;
cin>>q;
if (q == 'q')
{
closesocket(sock);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
break;
}
}
}

}
else if (mode == 1)
{
string ip;
int port = 0;
sockaddr_in addr;
addr.sin_family = AF_INET;
SELECT_IP:
cout << "输入服务IP" << endl;
cin>>ip;
PHOSTENT phost = gethostbyname(ip.c_str());
if (phost == NULL)
{
goto SELECT_IP;
}
else
{
addr.sin_addr.S_un.S_addr = *(u_long *) phost->h_addr_list[0];; //inet_addr(ip.c_str());
}

cout<<"输入端口"<<endl;
cin>>port;
addr.sin_port = htons(port);

cout<<"输入要发送的数据"<<endl;


sockaddr_in bind;
bind.sin_addr.S_un.S_addr = htons(INADDR_ANY);
bind.sin_port = htons(port-1);
bind.sin_family = AF_INET;
::bind(sock, (SOCKADDR*)&bind, sizeof(bind));

HANDLE hThread = CreateThread(NULL, 0, RecvProc, (void*)sock, 0, NULL);

char q = 0;
cout<<"press q to quit"<<endl;
while (true)
{
string buffer;
cin>>buffer;
int sendResult = sendto(sock, buffer.c_str(), buffer.size(), 0, (SOCKADDR*)&addr, sizeof(addr));

cin>>q;
if (q == 'q')
{
closesocket(sock);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
break;
}
}

}
else
{
cout << "输入正确的的模式" << endl;
goto SELECT_MODE;
}


return nRetCode;
}


这是一个简单的upd 回显程序,运行程序选择0,就是服务端,输入监听端口之后,客户端开始网这个端口发数据,服务端就会把数据打出来,然后在发回客户端.

这个在本机上运行是好的

一台机器是win7 ip:192.168.0.195
一台机器是xp ip:192.168.0.134
都关闭了防火墙,360之类的碉东西
都是用网线连接到路由器的

现在的问题是
如果从win7向xp发包,xp机器能正常收到

如果是xp向win7发包,在win7上打开的抓包程序也都能看到包到本机了,但是就是recvfrom读不到数据.

哪位朋友提供下思路,怎么寻找根源问题.

...全文
947 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdzfjfhnui 2012-07-11
  • 打赏
  • 举报
回复
已解决,经过了解,该win7系统是ghost方式安装的,最后在我的劝说下,用win7原盘一步一步安装了win7,装好驱动之后,运行程序一切正常.

jdzfjfhnui 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
如果是xp向win7发包,在win7上打开的抓包程序也都能看到包到本机了,但是就是recvfrom读不到数据.
-------------
你说的读不到数据指的是什么?阻塞在哪里没有返回还是怎么的?
[/Quote]

对就是recvfrom不返回,一直阻塞在那里,上班, 顶上去啊
yby4769250 2012-07-10
  • 打赏
  • 举报
回复
我之前好像也遇到过在xp上udp广播少量数据,xp能收到,win7不能收到,很郁闷,后来我设置socket选项禁用Nagle算法后就可以了,按理说,udp是没有tcp_nodelay的,但是反正我用了行,因为时间的关系我也没深入分析,留给楼主探索吧。
Eleven 2012-07-10
  • 打赏
  • 举报
回复
如果是xp向win7发包,在win7上打开的抓包程序也都能看到包到本机了,但是就是recvfrom读不到数据.
-------------
你说的读不到数据指的是什么?阻塞在哪里没有返回还是怎么的?
向立天 2012-07-10
  • 打赏
  • 举报
回复
win7上是不是还有防护措施没有禁用
Gloveing 2012-07-10
  • 打赏
  • 举报
回复
你的机器上的端口和别的程序有冲突嘛?

18,356

社区成员

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

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