はじめまして。
ソケット通信を利用したチャットプログラムを作成しています。
VCでプログラムを作成するのは初めてです。
コンパイルはエラー0、警告0で正常に終了しますが、
実行時に、ソケット通信を開通させて、クライアント側からコネクト
要求をするところで内部的にエラーになっているようです。
(動作を表面から眺めていると、何事もないかのように動いてはいます)
<以下はソースです。ダイアログベースのプログラムで接続ボタンを押すとコネクト処理が動く様になっています>
void CChaatDlg::OnConbtn()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
int err=0;
UpdateData(TRUE);
if ( mode == 0 ) {
// mode change
mode=1;
GetDlgItem(IDC_CONBTN)->EnableWindow(FALSE); // 接続ボタンを使用不可に
GetDlgItem(IDC_CUTBTN_CLIENT)->EnableWindow(TRUE);// 切断ボタンを使用可能に
GetDlgItem(IDC_SENDBTN)->EnableWindow(TRUE); // 送信ボタンを使用可能に
// サーバーへのソケットを接続する処理
m_ConnectSock.Create( );
err = GetLastError();
if ( err != 0 ) { MessageBox( connect error! , NULL, MB_OK ); }
m_ConnectSock.Connect( m_ServerName, m_Port );
err = GetLastError();
*この行でerr=10035*if ( err != 0 ) { MessageBox( connect error! , NULL, MB_OK ); }
// 通信モードをクライアントモードに
mode = 1;
}
}
GetLastErrorというのは直前のAPIの実行ステータスを取得する関数だそうです。
MSDNライブラリというドキュメントで調べたところ、
・sckWouldBlock 10035
・ソケットはブロック化処理を行いませんが、指定された処理はブロック化を行います。
という風に書いてあるのですが、具体的にどこを直して良いのかがわかりません。
どなたか知恵を貸して頂けますでしょうか。
宜しくお願いします。
WSAGetLastErrorな気がするのはおいておいて……。
10035 WSAEWOULDBLOCKですね。
非同期ソケットにおいて,要求された処理が即座に終了しなかったことを意味します。
この場合だと,即座に仮想回線を確立できなかったのでしょう。
回線が確立されたときにOnConnectが実行されます。
正確には,関連付けられた方法でFD_CONNECTが通知されます。
CAsyncSocketはそれをラップしてOnConnectを呼び出すようにしてあるのです。
とりあえず,MFCを使わずに,直にWinSockを触ってみることをお奨めします。
ありがとうございます。
実はせっかく説明してくださった内容があまりわからなかったのですが、
(知識不足のため)とにかく、WinAPIを利用して基本から触ったほうが
わかるのかなと考えています。
ダイアログの表示なども含めてWinAPIを利用したプログラムに切り換え
て再チャレンジしてみようと思います。
初心者の質問につきあって頂いてありがとうございました。