抓包工具已经看到数据到本机,但是recvfrom 读不到数据的问题?
- C/C++ code
#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读不到数据.
哪位朋友提供下思路,怎么寻找根源问题.
[解决办法]
你的机器上的端口和别的程序有冲突嘛?
[解决办法]
win7上是不是还有防护措施没有禁用
[解决办法]
如果是xp向win7发包,在win7上打开的抓包程序也都能看到包到本机了,但是就是recvfrom读不到数据.
-------------
你说的读不到数据指的是什么?阻塞在哪里没有返回还是怎么的?
[解决办法]
我之前好像也遇到过在xp上udp广播少量数据,xp能收到,win7不能收到,很郁闷,后来我设置socket选项禁用Nagle算法后就可以了,按理说,udp是没有tcp_nodelay的,但是反正我用了行,因为时间的关系我也没深入分析,留给楼主探索吧。