2016-07-04 99 views
-1

Ich versuche, eine Verbindung zu einem Gerät (Allen-Bradley-SPS) in einem LAN mit C. Das Gerät, das ich versuchen zu verbinden Host nicht ein Anwendung, die auf meine Anwendung hört (da ich keine Kontrolle darüber habe). Sobald die Verbindung hergestellt ist, kann ich Pakete senden und empfangen, die Daten anfordern. Ich habe bereits eine funktionierende Anwendung in C# entwickelt (mit System.Net.Sockets), die dieses Gerät verbindet und mit ihm kommuniziert. Der C-Code, den ich schreibe, scheint jedoch in dem Teil fehlzuschlagen, in dem er eine Verbindung herstellt. Hier ist meine Quellcode:Verbinden mit einem Gerät im LAN über TCP/IP mit C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#ifdef WINDOWS 
#include <winsock2.h> 
#else 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#endif 

#include <errno.h> 


int main() { 
char *servIP = "192.168.10.31"; 

in_port_t servPort = 503; 

int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

if (sock < 0) { 
    fprintf(stderr, "socket() failed: %s\n", strerror(errno)); 
    exit(1); 
} 

struct sockaddr_in servAddr; 
memset(&servAddr, 0, sizeof(servAddr)); 

servAddr.sin_family = AF_INET; 

int rtnVal = inet_pton(AF_INET, servIP, &servAddr.sin_addr.s_addr); 
if (rtnVal <= 0) 
{ 
    printf("failed"); exit(1); 
} 

if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) 
{ 
    printf("failed connecting"); exit(1); 
} 
else { 
    printf("connected"); 
} 

char x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
printf("terE"); 
write(sock, x, sizeof(x)); 

char buffer[1024]; 
recv(sock, buffer, 1024, 0); 
printf("Data received: %s", buffer); 


} 
+0

_seems an dem Teil zum Scheitern verurteilt, wo es connection._ Welche Fehler begründet? Könntest du bitte etwas ausarbeiten? – LPs

+0

Seitennotiz: Sind Sie sicher, dass "Buffer" ein Null beendet C-Strings ist? – LPs

+0

@LPs Das Programm endet bei "fehlgeschlagene Verbindung". Der Puffer war nur ein Spaghetti-Code, um zu testen, ob die Verbindung zuerst besteht, – Jarvis

Antwort

4

Sie haben vergessen, den Port für den Anruf zu connect() einzustellen.

Sie haben eine servPort Variable definiert, aber Sie weisen sie nicht der Variablen servAddr zu.

So sollten Sie hinzufügen:

servAddr.sin_port = htons(servPort); 

oder einfach:

servAddr.sin_port = htons(503); 
+0

Sie sind mein Held. – Jarvis

+0

@RemyLebeau Ty für deine Bearbeitung. – LPs

-1

Sie haben vergessen, den sin_port Sie Code sind.

Und Sie haben auch das WSAStartup vergessen. Schauen Sie sich dieses Tutorial könnte es helfen:

http://www.tenouk.com/Winsock/Winsock2example.html

+0

Der 's_addr' wird durch den Aufruf von' inet_pton() 'vor' connect() 'aufgefüllt. Aber Sie haben recht, wenn Sie 'WSAStartup()' unter Windows benötigen. –