2017-11-01 22 views
0

PHP에서 C로 전달해야하는 코드가 필요합니다. 코드는 SOCKET을 통해 명령을 원격 장치로 보낼 수 있습니다. 그것은 PHP에서 나를 위해 완벽하게 작동하지만 C로 변환해야합니다. PHP의 pack() 함수를 제외한 모든 것이 괜찮습니다. C로 대체하는 방법을 알지 못합니다. 기본적으로이 값을 전달해야합니다 :문자열을 16 진수에서 2 진수로 변환하여 소켓 C에 넣습니다.

$message = pack("H2H8H2H4H4", "a5", "00000001", "5e", "0000", "bc19"); 

mesaje_in_c = ¿?

감사의 말을 전하여 주시면 감사하겠습니다.

이것은 PHP 코드 :

<?php 

$host = "192.168.0.140"; 
$port = 8081; 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    print "socket_create() falló: razón: " . socket_strerror(socket_last_error()) ."\n"; 
} else { 
    print "create socket OK.\n"; 
} 

socket_set_option(
    $socket, 
    SOL_SOCKET, // socket level 
    SO_RCVTIMEO, // timeout option 
    array(
    "sec"=>10, // Timeout in seconds 
    "usec"=>0 // I assume timeout in microseconds 
    ) 
); 

// connect to server 
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n"); 
if ($result === false) { 
    print "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
} else { 
    print "connect to server OK.\n"; 
} 

$message = pack("H2H8H2H4H4", "a5", "00000001", "5e", "0000", "bc19"); 
echo "Message To server Bin: ".$message."\n"; 
echo "Message dec: "; 
print_r(unpack("H*", $message))."\n"; 

// send string to server 
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n"); 

// get server response 
$result = socket_read($socket, 1024) or die("Could not read server response\n"); 

print "Reply From Server Bin:".$result."\n"; 

$resultHex = unpack("H*", $result); 
print "Reply From Server Hex:"; 
print_r($resultHex)."\n"; 

// close socket 
socket_close($socket); 
?> 

그리고이 완료 될 때까지 C 코드 :

#include<stdio.h> 
#include<winsock2.h> 
#pragma comment(lib,"ws2_32.lib") //Winsock Library 

int main(int argc , char *argv[]){ 

    WSADATA wsa; 
    SOCKET s; 
    struct sockaddr_in server; 
    char *message , server_reply[2000]; 
    int recv_size; 

    printf("\nInitialising Winsock..."); 
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) 
    { 
     printf("Failed. Error Code : %d",WSAGetLastError()); 
     return 1; 
    } 

    printf("Initialised.\n"); 

    //Create a socket 
    if((s = socket(AF_INET , SOCK_STREAM , 0)) == INVALID_SOCKET) 
    { 
     printf("Could not create socket : %d" , WSAGetLastError()); 
    } 

    printf("Socket created.\n"); 


    server.sin_addr.s_addr = inet_addr("192.168.0.140"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(8081); 

    //Connect to remote server 
    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     puts("connect error"); 
     return 1; 
    } 

    puts("Connected"); 

    //Send some data 
    message = "a5000000015e0000bc19"; 
    // ???? message = pack("H2H8H2H4H4", "a5", "00000001", "5e", "0000", "bc19"); 

    if(send(s , message , strlen(message) , 0) < 0) 
    { 
     puts("Send failed"); 
     system("pause"); 
     return 1; 
    } 
    puts("Data Send\n"); 

    //Receive a reply from the server 
    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR) 
    { 
     puts("recv failed"); 
    } 

    puts("Reply received\n"); 

    //Add a NULL terminating character to make it a proper string before printing 
    server_reply[recv_size] = '\0'; 
    puts(server_reply); 

    system("pause"); 
    return 0; 
} 

난 당신이 내게 줄 수있는 지원을 부탁드립니다, 감사합니다!

답변

0

작동합니까?

char message[] = "\xa5\x00\x00\x00\x01\x5e\x00\x00\xbc\x19"; 
+0

안녕하세요 Furgas, 도와 주셔서 감사합니다. 나를 위해 작동하지 않습니다, 장치가 명령을 인식하지 못합니다. 이미 여러 가지 조합을 시도했지만 아무 것도 없습니다. – Alexander