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

jdzfjfhnui jdzfjfhnui 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#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读不到数据.

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

...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
jdzfjfhnui
网络编程 18,356 成员 64,161 内容