2018年1月11日木曜日

開発環境

Head First C ―頭とからだで覚えるCの基本 (David Griffiths (著)、Dawn Griffiths (著)、中田 秀基 (監修)、木下 哲也 (翻訳)、オライリージャパン)の11章(ソケットとネットワーキング - 127.0.0.1 という場所はない)、コードマグネット(p. 494)を取り組んでみる。

コードマグネット(p. 494)

コード

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <WS2tcpip.h>

void error(char *msg)
{
 char s[80];
 strerror_s(s, 80, errno);
 fprintf(stderr, "%s: %s\n", msg, s);

 system("pause");
 exit(1);
}

int open_socket(char *host, char *port)
{
 struct addrinfo *res;
 struct addrinfo hints;
 memset(&hints, 0, sizeof(hints));
 hints.ai_family = PF_UNSPEC;
 hints.ai_socktype = SOCK_STREAM;
 if (getaddrinfo(host, port, &hints, &res) == -1)
 {
  error("アドレスを解決できません");
 }
 int d_sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 if (d_sock == -1)
 {
  error("ソケットを開けません");
 }
 int c = connect(d_sock, res->ai_addr, res->ai_addrlen);
 freeaddrinfo(res);
 if (c == -1)
 {
  error("ソケットに接続できません");
 }
 return d_sock;
}

int say(int socket, char *s)
{
 size_t result = send(socket, s, strlen(s), 0);
 if (result == 0)
 {
  char s[80];
  strerror_s(s, 80, errno);
  fprintf(stderr, "サーバーとの通信エラー: %s", s);
 }
 return result;
}

int main(int argc, char *argv[])
{
 int d_sock = open_socket("en.wikipedia.org", "80");
 char buf[255];
 /* sprintf(buf, "GET /wiki/%s http/1.1\r\n", argv[1]); */
 sprintf_s(&buf, 255, "GET /wiki/%s http/1.1\r\n", "O'Reilly_Media");
 say(d_sock, buf);
 say(d_sock, "Host: en.wikipedia.org\r\n\r\n");
 char rec[256];
 int bytesRcvd = recv(d_sock, rec, 255, 0);
 while (bytesRcvd)
 {
  if (bytesRcvd == -1)
  {
   error("サーバーから読み込めません");
  }

  rec[bytesRcvd] = '\0';
  printf("%s", rec);
  bytesRcvd = recv(d_sock, rec, 255, 0);
 }
 close(d_sock);

 system("pause");
 return 0;
}

入出力結果(コマンドプロンプト)


>client.exe

>client.exe

>

ビルドはできたけど、実行すると、open_socket関数の中の29行目のsocket関数で動作が停止してるみたい。

0 コメント:

コメントを投稿