27

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 に追加できるライブラリ/パッケージはありますか?

注:ここからnetcat をダウンロードし、ここから CVS リポジトリを参照できます

4

6 に答える 6

27

BSD sys / socket.hはPOSIXヘッダーであり、win32APIはそれをサポートしていません。MinGWヘッダーは、ネイティブのwin32ヘッダーの単なる再実装であり、追加のPOSIX互換性を提供しません。

sys / socket.hのサポートを探している場合は、GNUgnulibのsys/ socket.hを置き換えるか、WindowsでPOSIX互換性ラッパーを提供するCygwinを使用してください。

于 2011-07-23T15:36:21.870 に答える
9

WinSock と WinSock2 は、BSD ソケットとは異なる関数名を持っています。クロスプラットフォーム アプリケーションを作成したい場合は、Microsoft を満足させるためだけに多くの回避策をコーディングしています。

MinGW に含まれる特別な「socket.h」および「socket.c」ファイルがあれば、それぞれの WinSock2 対応部分を呼び出すだけで簡単に変換できます。

私はCプログラミングを学び始めたばかりなので、自分でこれを行うことはできませんが、これまで誰も試みたことがないように思われることに驚いています.

于 2010-06-26T15:45:25.250 に答える
5

別の回答からのこれらのコメントは、単純なbsdソケットコードを取得してWindowsでmingwでコンパイルするために必要な回答として役立ちました。

これらのインクルードをすべて #include に置き換えます。これは winsock の同等のヘッダーになるため、何が起こるかを確認してください。

また、ws2_32 にリンクし、WSAStartup/WSACleanup を使用する必要があります。これにより、起動して実行できるようになります。

編集:またcloseshutdown/closesocketおよびwriteに置き換える必要がありましたsend。コードは正常にコンパイルされましたが、これらの追加の変更がないと実際には機能しませんでした。

于 2012-03-29T20:23:08.297 に答える
3

stackoverflow リンクを参照してください: "sys/socket.h" ヘッダー/ソース ファイルはどこで入手できますか?

答え/解決策はより明確です。

于 2014-07-11T10:28:03.820 に答える
3

MingWin はミニマリストであり、それが最も重要な側面です。理解しやすくなるため、最終的にアプリケーションを作成するのは開発者の責任です。MingWin は物事を簡単にするだけで、nix アプリを Windows に変換する魔法はありません。

于 2009-12-23T20:57:52.640 に答える
3

ChrisW が言ったように、Winsock2 は BSD ソケットのポートです。BSD ソケットとは異なる winsock のどの部分を使用しようとしていますか? (WSAStartup と WSACleanup を除く)

于 2009-10-05T01:18:52.470 に答える