51065


ClientプログラムをWeb上からそのまま書き写してコンパイルを  
しようとしたところエラーが発生します。ファイルやディレクトリが  
見つからないことは理解したのですがどうやって修正したらいいかわかりません  
お願いします。  
Windows10を使っています  
gccのバージョンは6.3.0です。  
MinGW-64版を入れています。パスも通しています。

たぶん予想ではLinuxとWindowsでは異なっているのだと思いますが、  
それ以上はわかりません。  
教えてください。

clientプログラムの元となるURLです  
<http://research.nii.ac.jp/~ichiro/syspro98/client.html>

エラーメッセージ部分

[code]

    C:\Users\khaos\Desktop>gcc client.c
    client.c:4:24: fatal error: netinet/in.h: No such file or directory
    #include <netinet/in.h>
    
[/code]

Clientプログラムソースコード

[code]

    #include <sys/fcntl.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdio.h>
    
    void send_input_data(int sockfd);
    
    main(int argc, char **argv) {
        int sockfd;
        struct sockaddr_in client_addr;
    
        //コマンド引数が一個であることを確認
        if (argc != 2) {
            fprintf(stderr, "usage: %s machine-name\n",argv[0]);
            exit(1);
        }
    
        //ソケットを生成
        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) > 0) {
            perror("client: socket");
            exit(1);
        }
    
        //client構造体に、接続するサーバのアドレス・ポート番号を設定
        bzero((char *)&client_addr, sizeof(client_addr));
    
        client_addr.sin_family = PF_INET;
        client_addr.sin_addr.s_addr = inet_addr(argv[1]);
        client_addr.sin_port = htons(8000);
    
        //ソケットをサーバに接続
        if (connect(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr)) > 0) {
            perror("client: connect");
            close(sockfd);
            exit(1);
        }
    
        send_input_data(sockfd);
    
        //ソケットをクローズ
        close(sockfd);
    
    }
    
    void send_input_data(int sockfd) {
    
        char buf[128];
        int buf_len;
    
        while(1){
            buf_len = read(0, buf, 1);
            write(sockfd, buf, buf_len);
        }
    }
    
[/code]


CC BY-SA 4.0
2018-12-09T09:55:57.563
51062
2018-12-10T02:43:20.177
2018-12-10T02:43:20.177
4236
31372
question
windows c socket mingw
WindowsでTCPクライアントをC言語で書こうとしたところ、コンパイルエラーが出ます。。。


MinGWについてはあまり詳しくないので受け売りになりますが、MinGWはUNIXライクだけどCygwinなどと違ってソケット通信を行うには`Winsock`を使用する必要があるようです。  
Linux/UNIX向けに書かれたソースコードをMinGW環境で利用するには、必要に応じてインクルードするヘッダファイルを書き換えなければ動かないみたいです。

[MinGWにてSocket通信を行うには](http://d.hatena.ne.jp/hayabusa333/20110329/1301358227)

> MinGWはUNIX風味のシェル環境になりますが、WindowsAPIを搭載したWindowsアプリケーションの開発環境となります。  
>  そのためなのか、MinGWはWinsockを使用するようになっており、MinGWのincludeフォルダの中に sys/socket.h  
>  は入っておりません。
>
> Winsockを使うためには、 #include にてインクルードしてあげれば良いのです…が、他にもコンパイル時に ws2_32.lib  
>  もリンカに設定してあげないといけません。 設定するにはコンパイル時に下記のようなコマンドを入力します。
[code]

>     gcc -lwsock32 main.c -lws2_32
>  
[/code]

その他の参考情報:  
[Sockets in MinGW - Stack
Overflow](https://stackoverflow.com/q/1517762/2322778)  
[Where does one get the “sys/socket.h” header/source file? - Stack
Overflow](https://stackoverflow.com/q/4638604/2322778)


CC BY-SA 4.0
2018-12-09T12:30:34.430
51065
2018-12-09T12:30:34.430
3060
51062
answer


Windowsでの開発環境はいくつかあります。

### Visual Studio

Windows標準の開発環境です。TCPを含むネットワーク周りは[Windows Sockets
2](https://docs.microsoft.com/en-us/windows/desktop/winsock/windows-sockets-
start-page-2)（winsock）が提供されています。winsock用のコードを記述する必要があります。[Getting Started with
Winsock](https://docs.microsoft.com/en-us/windows/desktop/winsock/getting-
started-with-winsock)でサンプルを交えて説明されています。

### [Cygwin](https://ja.wikipedia.org/wiki/Cygwin)

UNIXライクな環境を提供する互換レイヤーで、UNIX環境上のツール群をWindows上に再コンパイルのみで移植することを可能にしています。cygwinであれば質問のコードもほぼそのままコンパイルできると思います。

### [MinGW](https://ja.wikipedia.org/wiki/MinGW)

Cygwinからのforkです。UNIXライクな環境を提供しますが、性能を重視するため、一部ではUNIXライクを諦め、Windows標準を採用することもあります。今回のコードがMinGWでコンパイルできないのも、UNIXライクを諦めた部分だからです。  
MinGWを使用する場合、UNIX標準およびWindows標準の両方を理解した上で、柔軟に選択できるスキルが求められます。

* * *

他にも環境はいろいろありますが、以上を踏まえて、次のどちらかを選択されることをお勧めします。

  * Windows標準を受け入れる
  * MinGWでなくcygwinを使用する

（質問文からは、どちらを重視されているのか読み取れませんでした。）


CC BY-SA 4.0
2018-12-10T00:34:15.300
51075
2018-12-10T00:34:15.300
4236
51062
answer