2016-07-04 82 views
-1

我嘗試使用C連接到駐留在LAN中的設備(Allen-Bradley PLC)。 我嘗試連接的設備沒有託管監聽我的應用程序的應用程序(因爲我無法控制它)。 建立連接後,我可以發送和接收請求數據的數據包。我已經在C#中開發了一個工作應用程序(使用System.Net.Sockets),該應用程序連接並與此設備進行通信。 但是,我寫的C代碼似乎在它建立連接的部分失敗。 這裏是我的源代碼:使用C連接到通過TCP/IP的LAN上的設備使用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'是一個空終止的C-strings? – 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

在connect()之前,調用'inet_pton()'來填充's_addr'。但是你需要在Windows上使用'WSAStartup()'。 –

相關問題