2017-12-13 17 views
1

Google 번역기 API를 사용하여 C로 번역기를 만들려고합니다.C에서 winsockets를 통해 데이터 수신

지금까지 소켓을 만들고 초기화하고 연결했습니다. 텍스트를 번역해야하는 URL을 보냈지 만 응답 크기는 0 바이트입니다. 목적은 텍스트 파일 또는 문자열로 수신하는 것입니다.

이것은 지금까지 코드입니다.

#include<stdio.h> 
#include<winsock2.h> 
#include "count.c" 

#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"); 

    system("ping translate.googleapis.com"); 

    const char* ipadress; 
    printf("Enter IP adress of Hostname\n"); 

    scanf("%s",ipadress); 

    server.sin_addr.s_addr = inet_addr(ipadress); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(80); 

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

    puts("Connected"); 

    // Send some data 
    message = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=da&dt=t&q=Hello"; 
    if(send(s , message , strlen(message) , 0) < 0) 
    { 
     puts("Send failed"); 
     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'; 
    printf("size: %d\n",recv_size); 
    puts(server_reply); 

    return 0; 
} 
+0

HTTP 요청 - 소켓 아래로 URL을 발사 할 필요가 없다. (훨씬 복잡 할 필요는 없지만). Java에 대한 "how to"는 SO에 있지만 C (분명히)는 아니지만 [이 Tutorialspoint 페이지] (https://www.tutorialspoint.com/http/http_requests.htm)를 사용해보십시오. – TripeHound

+0

'system ("ping translate.googleapis.com");'그게 뭐야? 서버를 핑 (ping)하려고하면 HTTP 요청에 대해 포트 80에 성공적으로 연결할 수 있는지 여부를 알려주지 않습니다. 'ping'에 실패하면 여전히 연결할 수 있고,'ping'이 작동하면 포트 80에 대한 연결은 계속 실패 할 수 있습니다. "Y를 테스트하기 위해 X 시도"는 오류가있는 논리입니다. –

답변

1

두 가지 문제가 있습니다. 첫째, URL을 단독으로 보낼 수는 없습니다. 당신은 HTTP 요청을해야합니다. 이를 수행하는 가장 좋은 방법은 종종 LibCURL과 같은 타사 라이브러리를 사용하는 것이지만 매우 간단한 경우 손으로 직접 수행하는 것이 좋습니다. 적어도 GET 줄, Host: 헤더 및 빈 줄이 필요합니다. 요청을 형식화하고 응답을 구문 분석하는 방법은 HTTP RFC를 참조하십시오.

둘째, HTTPS를 사용하려는 경우 일반 텍스트를 소켓에 보낼 수 없으며 암호화 레이어도 있습니다. 다시 말하지만, 도서관이 필요합니다. (Linux에서는 OpenSSL 또는 libCURL을 사용하지만 Windows에도 존재하지만 다른 선택 사항이있을 수 있습니다.) 기본적으로 HTTP는 포트 80을 사용하지만 HTTPS는 포트 443을 사용합니다.

+0

알았어, 고마워. – Nabid