2015-08-18 2 views
-4

Так что я хочу прочитать файл и совместить 2 слова, сначала я подключился к сокету, чтобы получить запись, записать его в файл, тогда я хочу прочитать этот файл и получить соответствие 2 слова и сделать что-то послесловие, но кажется, что работа dosen't Так вот трескаНе читайте файл и получите результат

#include<stdio.h> 
#include<string.h> //strlen 
#include<sys/socket.h> 
#include<arpa/inet.h> //inet_addr 

int main(int argc , char *argv[]) 
{ 
    int socket_desc; 
    struct sockaddr_in server; 
    char *message, server_reply [2000]; 
    FILE *f; 
    //Create socket 
    socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
    if (socket_desc == -1) 
    { 
     printf("Could not create socket"); 
    } 

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

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

    puts("Connected\n"); 

    //Send some data 
    message = "GET/HTTP/1.1\r\n\r\n"; 
    if(send(socket_desc , message , strlen(message) , 0) < 0) 
    { 
     puts("Send failed"); 
     return 1; 
    } 
    puts("Data Send\n"); 

//Receive a reply from the server 
    if(recv(socket_desc, server_reply , 2000 , 0) < 0) 
    { 
     puts("recv failed"); 
    } 
    puts("Reply received\n"); 
    puts(server_reply); 
    // Open and write the file 
    f = fopen("date.txt", "w"); 
    fprintf(f, server_reply); 
    // read and match the words 
    while (fgets (server_reply, 2500, f)) { 
    if(strcmp(server_reply, "258")) 
    { 
    fputs(server_reply, f); 
     }else{ 
    puts("I could not loccate the bug"); 
    } 
    // file close 
    fclose(f); 
    return 0; 
} 
} 

может кто-то пожалуйста скажите мне, что я сделал не так!

ответ

1

Проблема в том, что вы считаете, что вы читаете строки из сокета. Это не правильно. Вы читаете байт. Там не подразумевается нулевой терминатор, вы должны сделать все это самостоятельно.

Сохраните возвращаемое значение recv(2) - это скажет вам, сколько байтов вы прочитали.

Читайте в цикле - recv(2) вернется, как только некоторых данных доступны (или другой конец закрыл соединение, или произошла ошибка), так что вам могут понадобиться, чтобы сшить сообщение вместе между чтениями.

+0

это то, что я получил. ** Ответ получен HT ** – f00

+0

Точно - посмотрите, что там не печатается символ? Это означает, что вы касаетесь памяти за пределами байтов, считанных из сокета. Это квитанция о бедствии (в лучшем случае авария). –

+0

и ваты действительно происходят? :) – f00

Смежные вопросы