2016-07-04 6 views
-1

Я пытаюсь подключиться к устройству (Allen-Bradley PLC), находящемуся в локальной сети, используя C. Устройство, к которому я пытаюсь подключиться, не содержит приложение, которое прослушивает мое приложение (поскольку я не контролирую его). Как только соединение установлено, я могу отправлять и получать пакеты, запрашивающие данные. Я уже разработал рабочее приложение на C# (используя System.Net.Sockets), которое подключается и взаимодействует с этим устройством. Однако код C, который я пишу, кажется, терпит неудачу в той части, где он устанавливает соединение. Вот мой исходный код:Подключение к устройству в локальной сети через TCP/IP с помощью 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 потерпеть неудачу в той части, где он устанавливает connection._ какая ошибка? не могли бы вы уточнить, пожалуйста? – LPs

+0

Боковое примечание: вы уверены, что 'buffer' - это N-концевые C-строки? – LPs

+0

@LPs Программа выходит из раздела «Не удалось подключиться». Буфер был всего лишь кодом спагетти, чтобы проверить, установлено ли соединение первым, – Jarvis

ответ

4

Вы забыли установить порт для вызова connect().

Вы определили переменную servPort, но вы не назначаете ее переменной servAddr.

Таким образом, вы должны добавить:

servAddr.sin_port = htons(servPort); 

или просто:

servAddr.sin_port = htons(503); 
+0

Ты мой герой. – Jarvis

+0

@RemyLebeau Ty для вашего редактирования. – LPs

-1

Вы забыли sin_port, чтобы вы код.

И вы также забыли WSAStartup. Посмотрите на этом уроке, это может помочь:

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

+0

's_addr' заполняется вызовом' inet_pton() 'перед' connect() '. Но вы правы в необходимости использования WSAStartup() 'в Windows. –