2011-01-09 14 views
19

私はC++ Unixスタイルのサーバーを作成しようとしていましたが、Windowsマシンで動いています。私はMinGWを使い始めましたが、コンパイルは正しく行われず、 "sys/socket.h"ファイルが見つかりませんでした。もちろん、サーバが動作するために必要なものはどれですか。私はそれを探しに行きました、そして、どこかにCygwinをインストールすると言いました。ライブラリの多くが付属しているからです。さて、私はそれをインストールしました。すべての単一のライブラリは、おそらく私を提供することができます。それから私は再びコンパイルに行きました、そして、それはまだそれを見つけることができません。 ENTIRE includesフォルダを検索して、ファイルを見つけることができませんでした。だから、私はちょっと寂しかった(私が必要としない余分な機能のために3時間ぐらい)が、私は検索を続けた。私はそれを見つけることができません。私はそれを使用するための複数の参照を見つけるが、私はそれをダウンロードするためにどこにも見つけることができません。私は過去数時間を探し求めていました。私はどこにいても参考にならないので、私はすべてのことに非常に不満を感じています。"sys/socket.h"ヘッダー/ソースファイルはどこから手に入りますか?

私は 'socket.h'/'socket.c'/'socket.cpp'ファイルをどこからダウンロードできますか?それは私の人生を変えてくれるはずです。

+1

Cygwinにはsys/socket.hを含むほとんどのPOSIXヘッダーがあります。あなたがそれを見つけられなかったのは奇妙です。私のCygwinのインストールは確かにそれを持っています。 –

+1

@Sergey、彼はCygwin経由でインストールすることなく、MinGWを直接インストールしているかもしれません。 –

+0

あなたはそれが必要ですか? Windowsでは、代わりに使用できるほとんど同じAPIが定義されています。クロスプラットフォームの移植性が必要な場合は、Boost.AsioやACEなどのライブラリを使用する方がよいでしょう。 – jalf

答えて

10

質問がC++にラベル付けされているので、boost::asio,ACE、またはC++用またはC用のその他のクロスプラットフォームソケットライブラリを使用したいと思うかもしれません。いくつかのクロスプラットフォームのライブラリは、 C++ sockets library for cross-platformおよびCross platform Networking API。サードパーティのクロスプラットフォームのソケットライブラリを使用すると、あなたのためのオプションではないと仮定すると

...

ヘッダ<sys/socket.h>はIEEE規格で定義されています。 1003.1(POSIX)、しかし残念ながら、WindowsはPOSIX標準に準拠していません。 MinGWコンパイラは、WindowsアプリケーションをコンパイルするためのGCCのポートであるため、これらのPOSIXシステムヘッダーは含まれません。 Cygwinを使用してGCCをインストールすると、Windows上でPOSIX環境をエミュレートするためにこれらのシステムヘッダーが組み込まれます。しかし、Cygwinをソケット用に使用する場合は、cygwin DLLをアプリケーションが読める場所に置く必要があります。b)CygwinのヘッダとWindowsのヘッダはあまりうまくやり取りできませんwindows.hを含める予定の場合は、おそらくsys/socket.hを含めることは望ましくありません。

個人的には、VirtualBox,download a copy of Ubuntuのコピーをダウンロードし、UbuntuをVirtualBoxにインストールし、Ubuntuでコーディングとテストを行ってください。また、マイクロソフトは「UNIXサブシステム」を販売していると言われています。これは、Windowsの特定のハイエンドエディションにあらかじめインストールされていますが、このシステムがどのように遵守されているかはわかりません(また、 UNIX標準のそれは準拠しています)。 Winsocketもオプションですが、たとえシグネチャが類似していてもPOSIXとは微妙に異なる動作をすることができます。私はあなたがのWinSockを使用しないことを示している知っているが、WinSockのは、どのようにTCPネットワークであるため、

#ifdef __WIN32__ 
# include <winsock2.h> 
#else 
# include <sys/socket.h> 
#endif 

:Windowsは何のsys/socket.hにしていないこと、あなたはこのような何かをやって検討するかもしれない考える

+2

あなたが言及しているサブシステムは[Interix](http://en.wikipedia.org/wiki/Interix)+1 –

+1

と呼ばれています。@BillyONeal、wikiページには、* Microsoftは2011年にInterixが公開されないと発表しましたWindows 8以降ではWindows版に含まれており、顧客はアプリケーションを別のソリューションに移行する必要があります。* – iammilind

+0

@iammilindはそのコメントの日付について何かを通知しますか? :) –

27

Windowsの下で行われている、私はあなたに何か別の選択肢があるとは思わない。クロスプラットフォームのネットワーキングライブラリを使用しても、そのライブラリはWinSockを内部的に呼び出します。標準的なBSDソケットAPI呼び出しのほとんどはWinSockで実装されていますので、少しばかげて、Windowsと他のOSの両方で同じソケットベースのプログラムをコンパイルできます。

#ifdef __WIN32__ 
    WORD versionWanted = MAKEWORD(1, 1); 
    WSADATA wsaData; 
    WSAStartup(versionWanted, &wsaData); 
#endif 

()の先頭にある...を忘れないでください。WSAサブシステムがプロセス用に初期化されていないため、Windowsでソケット呼び出しがすべて失敗します。

+0

あなたはクローズソケットのWindows版も必要ないのですか?他にもいくつかのことがありますか? – Pacerier

+0

はい、窓の下では、close()の代わりにclosesocket()を呼び出す必要があります。そしておそらく他のものも。 –

0

私はちょうどあなたがWindowsソケットライブラリを使用したい場合は、あなたがする必要があることを追加したいと思います:初めに

  • :最後にWSAStartupの()

  • を呼び出し:呼び出しWSACleanup( )

よろしくおねがいします。

0

gcc-g ++:gnuコンパイラコレクションC++(develカテゴリ)、opensshサーバとクライアントプログラム(net)、make:gnuバージョン(devel)、ncurses terminal(utils)強化されたvimエディタ(エディタ)、ANSI共通リプル実装(数学)、libncurses-devel(lib)

このライブラリファイルはcygwinの下でなければなりません\ USR \

よろしくあります。

関連する問題