Server Socket PC zu Client Socket Arduino über Ethernet Shield

Hallo zusammen,

ich möchte gerne eine Verbindung von meinem PC zu Arduino mittels des Ethernet Shields (W5100) aufbauen. Also Arduino über LAN an PC, sozusagen ein eigenes kleines Netzwerk. Hierzu habe ich einen einfachen Server Socket (Winsock) in C++ programmiert und kann den über die Konsole öffnen. Dieser Socket funktioniert auch, wenn ich ihn z.B. über Putty anspreche. Wenn ich jedoch den selben Socket mittels des Arduinos anspreche, passiert nicht, und die Verbindung failed.
Über Ping kann ich den Arduino ansprechen und dieser gibt mir response.
Die IP des PCs habe ich auch zu statisch geändert.
Kann mir jemand sagen, an was das liegen könnte,danke?
Gruß
Luggy

Server Socket

//TCP Server
//#pragma comment (lib, "ws2_32.lib")
#include <cstdio>
#include <iostream>
#include <Winsock2.h>
#include <Windows.h>
using namespace std;
int main()
{
//Hilfsvariable
long res;

//Versionsdaten 
WSADATA wsaData;

//ws2_32.dll aktivieren 
res = WSAStartup(MAKEWORD(2,0), &wsaData);
if(res==0)
 cout << "WSAStartup()\t\t successfull" << endl;
else
 cout << "error WSAStartup(): " << WSAGetLastError << endl;

//Socket Deskriptoren 
SOCKET slisten, client;

//Socket anfredern bzw, Kommunikationsendpunkt einrichten
//Stream für TCP
//0 für die Angabe des Protokolls
slisten = socket(AF_INET, SOCK_STREAM, 0);
if(slisten != INVALID_SOCKET)
 cout << "socket()\t\t successfull" << endl;
else
 cout << "socket(): " << WSAGetLastError << endl;
 
//Verbindungsinforamtionen 
sockaddr_in info;  //sockaddr
info.sin_addr.s_addr = inet_addr("192.168.137.1");
info.sin_family = AF_INET;
info.sin_port = htons(54345); //Byteorder
int infolen = sizeof(info);

res = bind(slisten, (struct sockaddr*)&info, infolen);
if(res != SOCKET_ERROR)
 cout << "bind()\t\t\t successfull" << endl;
else
 cout << "bind(): " << WSAGetLastError << endl;

//Warteschlange für einkommende Verbindungen
res = listen(slisten, SOMAXCONN); //mit SOMAXCONN maximale Verbindungszahl
if(res != SOCKET_ERROR)
 cout << "listen()\t\t successfull" << endl;
else
 cout << "listen(): " << WSAGetLastError << endl;

sockaddr_in clientinfo;
int clientinfolen = sizeof(clientinfo);

while(1)
{
 client = accept(slisten, (struct sockaddr*)&clientinfo, &clientinfolen);
 if(client != SOCKET_ERROR)
  cout << "client accepted: " << inet_ntoa(clientinfo.sin_addr) << ":"
   << ntohs(clientinfo.sin_port) << endl;
}

closesocket(client);
closesocket(slisten);
WSACleanup();
return 0;
}

Arduino Client Socket

#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
 //0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
 0x92, 0xA3, 0xAB, 0x42, 0x14, 0xEB
};
IPAddress ip(192, 168, 137, 2);

// Enter the IP address of the server you're connecting to:
IPAddress server(192, 168, 137, 1);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 23 is default for telnet;
// if you're using Processing's ChatServer, use port 10002):
EthernetClient client;
void setup() {
 // start the Ethernet connection:
 Ethernet.begin(mac, ip);  
 // Open serial communications and wait for port to open:
 Serial.begin(9600);
 while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB port only
 }

 // give the Ethernet shield a second to initialize:
 delay(1000);
 Serial.println("connecting...");
 Serial.println(Ethernet.localIP());
 
//   if you get a connection, report back via serial:
 if (client.connect(server, 54345)) {
   Serial.println("connected");
 } else {
   // if you didn't get a connection to the server:
   Serial.println("connection failed");
 }
}

Damit Dein Code besser lesbar ist (besonders auf mobilen Geräten) setze ihn bitte in Codetags. Das ist der </>-Button oben links im Forumseditor, oder stelle [code] davor und [/code] dahinter - ohne die *!
Das kannst Du auch nachträglich noch ändern.

Gruß Tommy

Hallo Luggy,

vor kurzem beschäftigte mich eine ähnliche Situation.
Meine Aufgabe war es eine Kommunikation zwischen einem ABB-Roboter (Server) und einem Arduino M0 Pro (Client) zu erstellen. Dies basiert ebenfalls auf einer Socket-Kommunikation.

Mein Arduino Code wurde zur besseren Lesbarkeit in Funktionen gegliedert. So weit ich es verstanden habe hast du Probleme bei der Erstellung des Sockets am Arduino, oder?

Falls es dir weiterhilft hast du hier einmal meinen Code:

Mir ist bewusst das die Umsetzung mit dem goto-Label nicht ideal und sicher auch nicht stabil ist, allerdings funktioniert es derzeit, und somit bleibt es vorerst auch. (Never change a runing system. :slight_smile: )

Definitionen:

byte server[] = { 192, 168, 200, 1 }; // IP-Adresse des Roboters
int port = 1025;
byte mac[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA }; // MAC-Adresse des Ethernet-Shields
byte ip[] = { 192, 168, 200, 2 }; // IP-Adresse des Arduinos
EthernetClient client;

Setup:

void ethernet_connect()
{
ethernet_back:
  Ethernet.begin(mac, ip);
  // Connecting with the server
  Serial.print("Connecting...");
  if (client.connect(server, port)) {
    Serial.println("done!");
  } else {
    Serial.println("error! Reconnecting");
    delay(1000);
    goto ethernet_back;
  }
  client.write("Connected!");
}

Hallo Tommy,

Danke für die Info, den Button habe ich gesucht!

Hallo BandR,
ich werde deinen Socket für den Arduino morgen mal ausprobieren, von der Thematik klingt das auf alle Fälle ähnlich! Den Goto-Tag könntest du vllt mit einer while-Schleife umgehen.

Grüße und bis dahin
Luggy