抓包工具已经看到数据到本机,但是recvfrom 读不到数据的问题?
#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读不到数据.
哪位朋友提供下思路,怎么寻找根源问题.
...全文
相关推荐
非阻塞recvfrom的设置
系统默认recvfrom函数是阻塞的,这里是非阻塞的设置!!!
recvfrom()和sendto()函数
recvfrom()和sendto()函数
Linux系统调用-- recv/recvfrom 函数详解
从套接字上接收一个消息。对于recvfrom ,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。 假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。
c++接收本机UDP数据
c++接收本机UDP数据
原始SOCKET抓包与数据分析
原始SOCKET抓包与数据分析,网上的一些不能运行,是因为参数设置出错。


网络编程
