抓包工具已经看到数据到本机,但是recvfrom 读不到数据的有关问题
抓包工具已经看到数据到本机,但是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; }