私は、MinGWを使用してMSYSでnetcatを構築しようとしていましたが、MinGWがBSDソケットのすべてを実際にWindowsに移植していないことに気づきました(例:sys/socket.h)。 MinGWでWindowsソケットを使用できることは知っていますが、なぜBSDソケットのWindowsポートを作成しなかったのですか?この問題を回避するために#ifdefを使用しているプログラムがかなりあることに気付きました。代わりに使用できるBSDソケットのWindowsポートはどこにありますか?
MSYSでnetcatのmakeを実行するときのエラーは次のとおりです。
gcc -DLOCALEDIR=\"\/usr/local/share/locale\" -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -Wall -c `test -f 'core.c' || echo './'`core.c
In file included from core.c:29:
netcat.h:38:24: sys/socket.h: No such file or directory
netcat.h:39:63: sys/uio.h: No such file or directory
netcat.h:41:24: netinet/in.h: No such file or directory
netcat.h:42:55: arpa/inet.h: No such file or directory
MinGWには#ifdefはありません。エラーなしですべてをコンパイルするためにMSYSに追加できるライブラリ/パッケージはありますか?
BSD sys/socket.h はPOSIXヘッダーであり、win32 APIはこれをサポートしていません。 MinGWヘッダーはネイティブのwin32ヘッダーの再実装にすぎず、追加のPOSIX互換性を提供していません。
Sys/socket.hサポートを探している場合は、GNU gnulibの sys/socket.hの置換 を試すか、または Cygwin を使用してください。これは、WindowsでPOSIX互換ラッパーを提供します。
WinSockおよびWinSock2には、BSDソケットとは異なる関数名があります。クロスプラットフォームアプリケーションを作成したい場合は、Microsoftを満足させるためのコードがたくさんあります。
MinWinに含まれている特別な「socket.h」および「socket.c」ファイルがあり、それぞれのWinSock2カウンターパートを呼び出すことによって単にデータを変換する場合は、はるかに簡単です。
Cプログラミングを始めたばかりなので、自分ではできませんが、今まで誰もやったことがないようです。
別の回答からのこれらのコメントは、Windowsでmingwを使用してコンパイルする簡単なbsdソケットコードを取得するために必要な回答として機能しました。
これらすべてのインクルードを#includeで置き換えます。これはwinsockの同等のヘッダーになるため、何が起こるかを確認してください。
また、ws2_32に対してリンクし、WSAStartup/WSACleanupを使用する必要があります。これはあなたを元気にさせるかもしれません。
編集:close
をshutdown
/closesocket
に置き換え、write
をsend
に置き換える必要もありました。コードは正常にコンパイルされましたが、実際にはこれらの追加の変更なしでは機能しませんでした。
Stackoverflowリンクを参照してください。 「sys/socket.h」ヘッダー/ソースファイルはどこで取得できますか?
答え/解決策はより明確です。
MingWinはミニマリストであり、それはそれの最も重要な側面です。理解しやすくなるため、最終的にはアプリケーションを作成するのは開発者の責任です。 MingWinは物事を簡単にするだけですが、NixアプリをWindowsに変換する魔法はありません。
ChrisWが言ったように、Winsock2はBSDソケットのポートです。 BSDソケットとは異なるwinsockのどの部分を使用しようとしていますか? (WSAStartupおよびWSACleanup以外)
エラーなしですべてをコンパイルするためにMSYSに追加できるライブラリ/パッケージはありますか?
MSYSはCygwinのフォークです。 Cygwinと同様にBSDソケットAPIを提供します。 MSYSを使用している場合は、次のようにコードをコンパイルできます。
gcc -c -o test.o test.c -I/include
-I/include
は、コンパイラにMSYSインクルードディレクトリを検索させるために必要です。
そして、このようにリンクします:
gcc -o test.exe test.o /bin/msys-1.0.dll