双机通信问题
C+侦探 2018-05-07 04:03:40 最近做了一个设备,通过网络接口发送UDP数据包,与计算机链接调试应用程序的时候发现直接与电脑通过网线链接,应用程序收不到数据包,但用wireshark能抓到数据包。如果设备不直接与计算链接,而是通过路由器与计算机链接,应用程序可以收到数据包。
代码如下
// socket.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdint.h>
#include <Windows.h>
#include <string.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
#define RESULT_ERROR 1
#define RESULT_OK 0
#define UDP_PORT 20000
SOCKET g_socket;
BOOL g_bThreadGo;
int startUDPConnection(uint16_t port, SOCKET* pSocket)
{
WSADATA wsa;
SOCKADDR_IN addr;
int ret;
int rc;
unsigned int opval =1;
DWORD dwBytesRet;
ret =::WSAStartup(MAKEWORD(2, 2), &wsa);
if(ret) {
cout <<"Can't satrt Windows Sock API" <<endl;
return RESULT_ERROR;
}
*pSocket =::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(INVALID_SOCKET ==*pSocket) {
cout <<"Couldn't create UDP socket" <<endl;
return RESULT_ERROR;
}
addr.sin_family =AF_INET;
addr.sin_port =htons(port);
addr.sin_addr.S_un.S_addr =ADDR_ANY;
rc =::bind(*pSocket, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR ==rc) {
cout <<"Bind didn't work, Error code: " <<WSAGetLastError() <<endl;
return RESULT_ERROR;
}
return RESULT_OK;
}
void stopUDPConnection(SOCKET* pSocket)
{
::closesocket(*pSocket);
::WSACleanup();
}
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
if(RESULT_ERROR ==startUDPConnection(UDP_PORT, &g_socket)) {
cout <<"startUDPConnection is faild" <<endl;
::stopUDPConnection(&g_socket);
::system("pause");
return 0;
}
DWORD dwCounter =0;
SOCKADDR_IN remoteAddr;
int32_t remoteAddrLen;
int8_t udpPacketBuff[2048];
remoteAddrLen =sizeof(SOCKADDR_IN);
while(g_bThreadGo) {
int32_t rc =::recvfrom(g_socket, (char*)udpPacketBuff, 2048, 0, (sockaddr*)&remoteAddr,
&remoteAddrLen);
if((-1) !=rc) {
dwCounter++;
cout <<"Receive Data Counter: " <<dwCounter <<endl;
cout <<udpPacketBuff <<endl;
}
}
stopUDPConnection(&g_socket);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadId;
g_bThreadGo =TRUE;
HANDLE hThread =::CreateThread(NULL, 0, ThreadFunc, 0, 0, &dwThreadId);
::Sleep(10000);
g_bThreadGo =FALSE;
::WaitForSingleObject(hThread, INFINITE);
::system("pause");
return 0;
}