Hej

Napisałem prosty serwer w Javie i chcę odbierać nim pakiety UDP nadesłane z Arduino. Korzystam z biblioteki do karty sieciowej ENC26J60: https://www.aelius.com/njh/ethercard/
Z jakiegoś powodu pakiety nie docierają na serwer... Firewall Windowsa dla testów wyłączyłem całkowicie. Klient na PC i serwer na Arduino - taka konfiguracja działa, natomiast w drugą stronę nie...
Testowałem również dla serwera napisanego w C++ i z takim samym miernym rezultatem. Serwer uruchamiałem zarówno na PC i RaspberryPi. Komputer z Raspberry jest w stanie się porozumieć zarówno jaki klient jak i serwer. Wygląda na to jakby coś blokowało pakiety nadesłane z Arduino do serwera.

Klient na Arduino:

#include <EtherCard.h>

static byte mymac[] = { 0x1A,0x2B,0x3C,0x4D,0x5E,0x6F };
byte Ethernet::buffer[700];
static uint32_t timer;


const char website[] PROGMEM = "komp"; //DNS skonfigurowany w routerze

const int dstPort PROGMEM = 5400;
const int srcPort PROGMEM = 4321;

void setup () {
  Serial.begin(9600);

  // Change 'SS' to your Slave Select pin, if you arn't using the default pin
  if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);
  ether.printIp("DNS: ", ether.dnsip);

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");

  ether.printIp("SRV: ", ether.hisip);
}

char textToSend[] = "test";

void loop () {
  
     ether.sendUdp(textToSend, sizeof(textToSend), srcPort, ether.hisip, dstPort );
     delay(1000);
}

Serwer Java

class EchoServer extends Thread {

    private DatagramSocket socket;
    private boolean running;
    private byte[] buf = new byte[256];

    int src_port = 5400;

    public EchoServer() throws Exception {

        socket = new DatagramSocket(src_port,InetAddress.getByName("192.168.1.103"));
        InetAddress address = InetAddress.getByName("192.168.1.99");        //adres IP ATmega328p
        boolean ping = address.isReachable(5000);
        System.out.println("ping success? " + ping);
    }

    public void run()  {

        try {
            running = true;
            System.out.println("start...");
            while (running) {
                System.out.println("waiting for packet...");
                DatagramPacket packet
                        = new DatagramPacket(buf, buf.length);

                socket.receive(packet);

                System.err.println("Packet info...");
                System.err.println("address:" + packet.getAddress());
                System.err.println("port:" + packet.getPort());
                System.err.println("socket address:" + packet.getSocketAddress());


                String received
                        = new String(packet.getData(), 0, packet.getLength());
                System.out.println(received);
            }
            socket.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}


public class Main {

    public static void main(String[] args) throws Exception {

        new EchoServer().start();
        while(true) { }
    }
}

Serwer C++

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>

#include <WS2tcpip.h>

#pragma comment (lib,"ws2_32.lib")

using namespace std;

int main() {

	WSADATA data;
	WORD version = MAKEWORD(2, 2);
	int wsOK = WSAStartup(version, &data);
	if (wsOK != 0) {
		cerr << "Cant start WinSock\n";
		exit(EXIT_FAILURE);
	}
	else {
		cout << "Successfull start WinSock\n";
	}
	SOCKET in = socket(AF_INET, SOCK_DGRAM, 0);

	ULONG server_addres = 0x728A86CF; //192.168.1.103
	sockaddr_in serverHint;
	//serverHint.sin_addr.S_un.S_addr = ADDR_ANY;
	//serverHint.sin_addr.S_un.S_addr = server_addres;
	inet_pton(AF_INET, "192.168.1.103", &serverHint.sin_addr.S_un.S_addr);
	serverHint.sin_family = AF_INET;
	serverHint.sin_port = htons(5400); //convert from little to big endian
	
	cout << "serverHint:" << serverHint.sin_addr.S_un.S_addr << endl;

	if (bind(in, (sockaddr*)& serverHint, sizeof(serverHint)) == SOCKET_ERROR) {
		cerr << "cant bind socket: " << WSAGetLastError() << endl;
		exit(EXIT_FAILURE);
	}
	else {
		cout << "Successfull bind socket\n";
	}

	sockaddr_in client;
	ZeroMemory(&client, sizeof(client));
	int clientLength = sizeof(client);
	char buf[1024];
	

	while (true) {

		ZeroMemory(buf, 1024);
		int bytesIn = recvfrom(in, buf, 1024, 0, (sockaddr*)&client, &clientLength);
		if (bytesIn == SOCKET_ERROR) {
			cerr << "Error receiving form client:" << WSAGetLastError() << endl;
			continue;
		}
		char clientIp[256];
		ZeroMemory(clientIp, sizeof(clientIp));

		inet_ntop(AF_INET, &client.sin_addr, clientIp, 256);

		cout << "Message recv from " << clientIp << " : " <<  buf <<  endl;

	}

	closesocket(in);

	WSACleanup();
}

Zamieszczam dodatkowo screeny z WireShark gdy Arduino pracuje jako serwer a dane nadeslane sa z klienta Java na PC. Może pozwoli to jakoś wydedukować problem...