All pastes #2109892 Raw Edit

Unnamed

public text v1 · immutable
#2109892 ·published 2012-02-05 09:51 UTC
rendered paste body
#include <stdio.h>
#include <winsock2.h>
#include <io.h>

int main(int argc, char *argv[]) {
  WSADATA wsaData;
  struct sockaddr_in server;
  SOCKET sock;
  char buf[32];
  char *deststr;
  unsigned int **addrptr;

  if (argc != 2) {
    printf("Usage : %s dest\n", argv[0]);
    return 1;
  }
  deststr = argv[1];

  if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
    printf("WSAStartup failed\n");
    return 1;
  }

  //sock = socket(AF_INET, SOCK_STREAM, 0); これだとエラーになる。
  sock = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0) ;

  server.sin_family = AF_INET;
  server.sin_port = htons(80); // HTTPのポートは80番です

  server.sin_addr.S_un.S_addr = inet_addr(deststr);
  if (server.sin_addr.S_un.S_addr == 0xffffffff) {
    struct hostent *host;

    host = gethostbyname(deststr);
    if (host == NULL) {
      if (WSAGetLastError() == WSAHOST_NOT_FOUND) {
        printf("host not found : %s\n", deststr);
      }
      return 1;
    }

    addrptr = (unsigned int **)host->h_addr_list;

    while (*addrptr != NULL) {
      server.sin_addr.S_un.S_addr = *(*addrptr);

      // connect()が成功したらloopを抜けます
      if (connect(sock,
                  (struct sockaddr *)&server,
                  sizeof(server)) == 0) {
        break;
      }

      addrptr++;
      // connectが失敗したら次のアドレスで試します
    }

    // connectが全て失敗した場合
    if (*addrptr == NULL) {
      printf("connect : %d\n", WSAGetLastError());
      return 1;
    }
  } else {
    if (connect(sock,
                (struct sockaddr *)&server,
                sizeof(server)) != 0) {
      printf("connect : %d\n", WSAGetLastError());
      return 1;
    }
  }

  int fd = _open_osfhandle(sock, 0);
  if (fd < 0) {
    printf("fd : %d\n", WSAGetLastError());
    return 1;
  }

  if (sock == INVALID_SOCKET) {
    printf("socket : %d\n", WSAGetLastError());
    return 1;
  }

  // HTTPで「/」をリクエストする文字列を生成
  memset(buf, 0, sizeof(buf));
  sprintf(buf, "GET / HTTP/1.0\r\n\r\n");

  // HTTPリクエスト送信
  int n = _write(fd, buf, (int)strlen(buf));
  printf("send-cont : %s\n", buf);
  if (n < 0) {
    printf("send : %d\n", WSAGetLastError());
    return 1;
  }

  // サーバからのHTTPメッセージ受信
  while (n > 0) {
    memset(buf, 0, sizeof(buf));
    n = read(fd, buf, sizeof(buf));
    if (n < 0) {
      printf("recv : %d\n", WSAGetLastError());
      return 1;
    }

    // 受信結果を表示
    fwrite(buf, n, 1, stdout);
  }

  _close(fd);

  WSACleanup();
}