前提・実現したいこと
"www.yahoo.co.jp"からTCP/IPを使用してHTTPソケットからHTMLコードをコンソールに表示したいです。
該当ソースコードをコンパイル・実行して頂けると分かるのですが、正しく動作します。
しかし、個人的に疑問があるのでどなたかご教授頂けると幸いです。
発生している問題・エラーメッセージ
該当ソースコードにおける
c++
1sprintf(buf, "GET %s\r\n", filename); 2write(1, buf, strlen(buf)); 3write(s, buf, strlen(buf)); 4 5while (1) { 6 code = read(s, buf, sizeof(buf)); 7 if(code <= 0) break; 8 write(1, buf, code); 9}
の部分ですが、いまいち理解が出来ません。
凄く簡潔に話すなら、yahooサーバとソケットを用いて通信経路を確率した後に、
sizeof(buffer)分読み込んでwriteで標準出力すれば良いと思っています。
その場合、個人的には、以下のコードのみで実行出来て欲しいのですが、上手く動作してくれません。
c++
1while(true){ 2 code = read(s, buffer, sizeof(buffer)); 3 if(code <= 0){ break; } 4 write(1, buffer, code); 5}
以下の部分が必要な理由を分かりやすく教えて頂けると幸いです。
よろしくお願いします。
c++
1sprintf(buf, "GET %s\r\n", filename); 2write(1, buf, strlen(buf)); 3write(s, buf, strlen(buf));
該当のソースコード
c++
1#include <iostream> 2#include <netdb.h> 3#include <netinet/in.h> 4#include <strings.h> 5#include <sys/socket.h> 6#include <string.h> 7#include <unistd.h> 8 9#include <stdio.h> 10 11#include <errno.h> 12 13using namespace std; 14 15#define HTTP (u_short)80 16 17int main() 18{ 19 /* gethostbyname */ 20 const char *hostname = "www.yahoo.co.jp"; 21 struct hostent *hostent; 22 23 hostent = gethostbyname(hostname); 24 /* gethostbyname */ 25 26 /* sockaddr_in */ 27 struct sockaddr_in sockaddr_in; 28 29 bzero((char*)&sockaddr_in, sizeof(sockaddr_in)); 30 31 sockaddr_in.sin_family = AF_INET; 32 sockaddr_in.sin_port = htons(HTTP); 33 34 bcopy(hostent->h_addr_list[0], (char*)&sockaddr_in.sin_addr, hostent->h_length); 35 /* sockaddr_in */ 36 37 /* socket */ 38 int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 39 40 int code = connect(s, (struct sockaddr*)&sockaddr_in, sizeof(sockaddr_in)); 41 42 char buffer[5000]; 43 44 sprintf(buf, "GET %s\r\n", filename); 45 write(1, buf, strlen(buf)); 46 write(s, buf, strlen(buf)); 47 48 while (1) { 49 code = read(s, buf, sizeof(buf)); 50 if(code <= 0) break; 51 write(1, buf, code); 52 } 53 54 close(s); 55 /* socket */ 56 57 /* errno */ 58 cout<<"errno: "<<strerror(errno)<<endl; 59 /* errno */ 60 61 62 63 return 0; 64}
試したこと
以下コードをコメントアウトしたりして、一行ずつ実行したりしてみた。
また、サイトを参照したりした。
参照サイト1
参照サイト2
c++
1sprintf(buf, "GET %s\r\n", filename); 2write(1, buf, strlen(buf)); 3write(s, buf, strlen(buf)); 4 5while (1) { 6 code = read(s, buf, sizeof(buf)); 7 if(code <= 0) break; 8 write(1, buf, code); 9}
補足情報
WSL(Windows Subsystem for Linux)
g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
回答3件
あなたの回答
tips
プレビュー