双机通信问题

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;
}
...全文
769 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinkon007 2018-05-30
  • 打赏
  • 举报
回复
不通过socket走,直接网卡底层来按协议收发包,这样能绕开防火墙
赵4老师 2018-05-08
  • 打赏
  • 举报
回复
百度搜“防火墙穿透”
C+侦探 2018-05-07
  • 打赏
  • 举报
回复
现在有一个新的问题,假如防火墙不允许这个应用程序通过防火墙,这个应用程序怎样可以穿透防火墙接收发送过来的UDP呢?
C+侦探 2018-05-07
  • 打赏
  • 举报
回复
谢谢你的回复,已经试过了,不是这个问题,问题找到了,是防火墙的问题。
zgl7903 2018-05-07
  • 打赏
  • 举报
回复
试试 ::socket(AF_INET, SOCK_DGRAM, 0)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧