最近做了一個設備,通過網路介面發送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;
}
uj5u.com熱心網友回復:
試試 ::socket(AF_INET, SOCK_DGRAM, 0)uj5u.com熱心網友回復:
謝謝你的回復,已經試過了,不是這個問題,問題找到了,是防火墻的問題。uj5u.com熱心網友回復:
現在有一個新的問題,假如防火墻不允許這個應用程式通過防火墻,這個應用程式怎樣可以穿透防火墻接收發送過來的UDP呢?uj5u.com熱心網友回復:
百度搜“防火墻穿透”uj5u.com熱心網友回復:
不通過socket走,直接網卡底層來按協議收發包,這樣能繞開防火墻轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/68632.html
標籤:網絡編程
下一篇:問題求解
