сокеты, получая пустой ответ от внешнего домена - PullRequest
1 голос
/ 21 февраля 2012

У меня есть этот код, простой пример кода на сокете C, он отлично работает для простого сервидора, который я написал и запустил на локальном компьютере, но если я попытаюсь, например, получить HTML-код с веб-страницы Google, это значительно задержит время ответить и вернуть пустой буфер.

мой код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <errno.h>


void bye(char * mmo);

void bye(char * mm) {
    printf("%s\n", mm);
    exit(0);
}

int main(void) {

    int tcpSocket, port;
    char buffer[256],err[256], *servername,* mm;

    struct hostent *server;
   struct sockaddr_in serverAddr;

    servername = "google.com";
    tcpSocket = socket(AF_INET, SOCK_STREAM, 0);
    port = 80;

    server = gethostbyname(servername);
    mm = "baa";

    if(tcpSocket < 0) {
        sprintf(err, "Can't to initialize TCP socket communication(%s).",   strerror(errno));
        bye(err);
    }   

    if(NULL == server) {
        bye("Server not found");
    }

     memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    memcpy(&serverAddr.sin_addr.s_addr,
              server->h_addr, 
           server->h_length);
   serverAddr.sin_port = htons(port);

    if(connect(tcpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {
        sprintf(err, "failed internet connection. %s", strerror(errno));
        bye(err);
    }
    if(write(tcpSocket, mm, strlen(mm)) < 0) {
        sprintf(err, "Can't send.(%s)\n", strerror(errno));
        bye(err);
    } 

    memset(buffer, 0, sizeof(buffer));

    while(read(tcpSocket, buffer, 255) < 0) {
            printf("%s", buffer);
    }

    close(tcpSocket);
    printf("done!\n");

    return 0;
}

Заранее спасибо .:)

1 Ответ

0 голосов
/ 04 марта 2012

Обращаясь к коду, который читает результат:

while(read(tcpSocket, buffer, 255) < 0) {
        printf("%s", buffer);
}

Такой код распечатывает содержимое буфера только в том случае, если read () возвращает значение меньше 0, а при чтении - в случае ошибки.,

Возможно, вы захотите изменить свой код следующим образом:

{
  size_t sizeReadTotal = 0;
  size_t sizeToRead = 255;
  ssize_t ssizeRead = 0;
  while (sizeToRead && (ssizeRead = read(tcpSocket, buffer + sizeReadTotal, sizeToRead))) {
    if (0 > sizeRead) {
      if (EAGAIN == errno || EWOULDBLOCK == errno)
        continue;
      else
        break;
    }

    sizeToRead -= ssizeRead;
    sizeReadTotal += ssizeRead;
  }

  if (0 > ssizeRead)
    printf("read() failed after having read %dbytes: %s\n", sizeReadTotal, strerror(errno));

  printf("Data read: '%s'\n", buffer);
}

Более того, вам также следует также отправить '\ n' на сервер (как уже упоминалось), поэтому измените:

mm = "baa";

в

mm = "baa\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...