プロが教える店舗&オフィスのセキュリティ対策術

winsockで双方向通信のため、非同期処理を行っているのですが、うまくいきません。

クライアント側で、WSAAsyncSelectの処理の後、Connectを呼んでいるのですが、Connectでエラーメッセージを返します。(エラーナンバー: 10035)

サーバ側はaccept処理はうまくいっているのですが、accept後うまく処理を返していないためだと思うのですが...

で質問は、
1.クライアント側、サーバ側にそれぞれ、WSAAsyncSelect
を記載しても問題ないか? クライアント側はConnect前で宣言。 サーバ側はbind前で宣言しています。

2.エラー番号10035は非ブロッキングモードで処理されないためにおきています。 Connectで非ブロッキングモード処理がされていないためだと思うのですが、他に記述しないといけない関数があるのでしょうか?

クライアント側:
// 非同期処理
if(WSAAsyncSelect(client_s,this->m_hWnd, FM_TCPPROC, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE) == SOCKET_ERROR){
return FALSE;
}

// コネクト処理
memset(&client,0,sizeof(client));
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr(IpAddress);
client.sin_port = htons(PORT_NO);
if(connect(client_s, (LPSOCKADDR)&client, sizeof(client)) == SOCKET_ERROR){ <-- ここでエラー
long ErrNum = WSAGetLastError(); <-- ここでエラーNoがかえる。
return FALSE;
}else{
NetFlg = true;
}

お分かりになる方教えてくださいませ。よろしくお願いします。

A 回答 (2件)

補足です



ちなみに poposan さんの プログラムの場合
this->m_hWndにFM_TCPPROCメッセージが飛びます

メッセージを拾い、connectに対する処理を書けばよろしいと思います

// サンプルコード ------------

LRESULT CXxxx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case FM_TCPPROC:
nEventCode = WSAGETSELECTEVENT(lParam);
nErrorCode = WSAGETSELECTERROR(lParam);
switch(nEventCode)
{
case FD_CONNECT:
// nErrorCode は connectの戻り値
// ここでエラー処理など
break;
}

break;
}

return CWnd::WindowProc(message, wParam, lParam);

}
    • good
    • 0
この回答へのお礼

ありがとうございました。
connectの後すぐエラー処理をしていたので、それで問題があったのですね。

Connect関数を読んだあとは、WindowProcの処理をしてしまうのですね。

双方向通信を作成しているので、WindowProcの処理方法を勉強しないといけませんね。

お礼日時:2005/05/24 19:52

WSAAsyncSelectを使用して非同期にしているので、ブロッ


キングするような関数(この場合はconnect)がすぐに制御
を返し、WSAEWOULDBLOCK(エラーナンバー: 10035)を返すのは正しい動作です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!