读书人

抓包工具已经看到数据到本机,但是recv

发布时间: 2012-08-17 02:08:34 作者: rapoo

抓包工具已经看到数据到本机,但是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的,但是反正我用了行,因为时间的关系我也没深入分析,留给楼主探索吧。

读书人网 >VC/MFC

热点推荐