NetWork WinForm:SOCKET起動について

3760 ワード

以前はSOCKET操作を書く時はC#、FRAMEWORKで便利でしたが、
実は自分で深く研究していないので、ただ調整することができて、使うことができます
最近同僚にC++を书いてもらったり、SOCKETにも触れたり..とてもSBB...△金融危機では、一人で何人かの仕事をしなければなりません.
CODEPROJECTのコードを参考にして、見ながら書きます.
SOCKETをインスタンス化するときはいつもエラーが発生します
SOCKET socket(
int af,
int type,
int protocol
);

The socket function creates a socket that is bound to a specific service provider.
if( (m_hSocket=socket(AF_INET, nType, 0))==INVALID_SOCKET)はすべてTRUEです...
気がふさいで、ヒントの異常も読めません.
あら.C++って難しい言葉ですね...
幸いなことに、同僚が手伝ってくれた:int iLastError=WSAGEtLastError();
10093を返して、エラー番号を調べて、やっと分かりました.
Successful WSAStartup not yet performed.
Either the application has not called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times.
 
WASStartup関数を呼び出す必要がありましたが、元のコードには作者がいません.自分で追加して実行できますが、あきらめません.
CSDNの先輩からの返信で何気なくこのような関数AfxSocketInitを見て、調べてみました.
「Platform SDK:Windows Socketsを使用する場合は、socket関数を呼び出して新しいsocketsを作成する前に、WSAstartup関数を呼び出す必要があります.WSAstartup関数は、Ws 2_32.dllライブラリの導入として機能します.MSDNによると、WSAstartup関数は、アプリケーションまたはDLLが呼び出す最初のWindows Sockets関数である必要があり、アプリケーションまたはDLLが必要なWindows Socketsバージョンと指定したWindows Socketsの実行の詳細を再確認します.次のWindows Sockets関数は、WSAstartup関数が正常に呼び出された後にのみ使用できます.
同様に、MFCパッケージのCSocketクラスを使用している場合は、Cresatを呼び出して新しいソケットを作成する前にAfxSocketInit関数を呼び出す必要があります.AfxSocketInit関数パッケージはWSAstartup関数で、役割は同じです.」
元のコードを調べてみると、InitInstance関数に本当に
 if(!AfxSocketInit())    {       AfxMessageBox(_T("Sockets can't be initialized"));       return FALSE;    }
これで分かりましたが、原作者はこれによってSOCKETを起動したのです....
MFCはこの方法を包装しました...どうしてこんなことになったの....後で知りますが、プラットフォーム呼び出しの問題だそうです...
ここにアドレスを追加して、SOCKETエラーについて、とても役に立ちます
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/winsock/winsock/windows_sockets_error_codes_2.htm
 
GetLastErrorも
[問題提起]
GetLastError()はDWORDの数字を返します.あるものはどういう意味か調べることができますが、あるものはできません.どうやって解決しますか.[プログラム実装]GetLastError()を使用する場合、情報LPVOID lpMsgBuf;//Windows will allocate::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError()、MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)//デフォルト言語(LPTSTR)&lpMsgBuf, 0, NULL );//表示::MessageBox(0,(LPCTSTR)lpMsgBuf,T("GetLastError"), MB_OK|MB_ICONINFORMATION );//lpMsgBufではあなたが望むエラーメッセージです.//メモリの解放::LocalFree(lpMsgBuf);    } 
WINSOCKを使ってからやっとたくさんのSOCKETの内容を知ることができて、以前の古いWIN 32 CODERは本当に容易ではありませんて、同じく本当に幸运です...
足早にSOCKETを勉强して、C++、MFCも勉强して、へへへ...WINSOCKの多くの歴史を認識しています!ワクワク中...
 
 
たくさんの人の書き方を見つけて、いい感じです.
「START関数でSTOPを呼び出す」.変数の初期化値の設定を行い、SOCKETなどのリソースの解放をオフにします.
1つのコンポーネントが呼び出し順序などで認識されている可能性があります.
しかし、他の人が呼び出すと、必ずしもそうではありません.このような書き方は、始める前にリソースの初期化をして、多くの誤操作を避けることができます.へへ、いいですね.