stackでのWinSock通信手段

[戻る]
クリスタル 2005/06/14(火) 01:05:28
開発環境:VC++6.0

WinSockで
WSASend()時とWSARecv()時にstackを引数にして送受信したいのですが
受信時にアクセスバイオレーションが出ていまい強制終了してしまいます。

stack<char> st;
st.push( 'あ' );
st.push( 'い' );
st.push( 'う' );
WSASend( SOCKET,reinterpret_cast<LPWSABUF>(&st),1,(DWORD*)&st,0,NULL,NULL);
// 送信時はエラーは起きない。

// WSARecv()は別プロセスで受信。
stack<char> st;   // 送信時と同じ型を宣言し引数に設定。
WSARecv(SOCKET,reinterpret_cast<LPWSABUF>(&st),1,(DWORD*)&st,0,NULL,NULL);

// 送信されたか確認の為表示。
while( !st.empty() )
{
     cout << (char)st.top() << ", ";
     st.pop();
}

受信したstackを表示しても送信した文字は表示されず
st.pop()を行った瞬間にメモリエラーになってしまいます。

どのようにすればこの現象を回避できるのでしょうか?
御教授お願い致します。

シャノン 2005/06/14(火) 01:25:51
> stack<char> st;
> st.push( 'あ' );
> st.push( 'い' );
> st.push( 'う' );

char に2バイト文字は入らない。

> WSASend( SOCKET,reinterpret_cast<LPWSABUF>(&st),1,(DWORD*)&st,0,NULL,NULL);

第2引数の型が違う。
第4引数は…送信したバイト数でスタックをぶち壊すのか?

> WSASend()時とWSARecv()時にstackを引数にして送受信したいのですが

STL のクラスはモジュール境界やプロセス境界を越えさせないほうがよい。
送信側と受信側でメモリレイアウトやランタイムライブラリが違う可能性がある。

古いスレッドには追加発言できません。