2012-02-23 23 views
0

私はクライアントサーバーアプリケーションを持っていて、私はTCPソケットを使用しています。クライアント側からのsend()リクエストでは、私は常にバスエラーを受け取り、プログラムは終了します。今ではウィキペディア検索を少し行いました。記事ではバスエラーが(存在しない物理アドレス、アライメントされていないメモリアクセス、切り詰められたmmappedファイルへのアクセス)に属性しています。私が送信している私の構造は、ちょうど3つのintとenumインスタンスなので、整列が問題ではないと思います。メインでLinuxのTCPバスエラー

typedef struct _commsg 
{ 
    RequestType requestType; 
    int client_pid; 
    int request_id; 
    int sector; 
}ComMsg; 

/* Create a reliable, stream socket using TCP */ 
if ((sock_id = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 
    DieWithError("socket() failed\n"); 

/* Construct the server address structure */ 
memset(&echoServAddr, 0, sizeof(echoServAddr));  /* Zero out structure */ 
echoServAddr.sin_family  = AF_INET;    /* Internet address family */ 
echoServAddr.sin_addr.s_addr = inet_addr(loopback_addr); /* Server IP address */ 
echoServAddr.sin_port  = htons(SERVER_PORT); /* Server port */ 

/* Establish the connection to the echo server */ 
if (connect(sock_id, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) 
    DieWithError("connect() failed"); 


if (send(sock_id, (void *)&_commsg, sizeof(ComMsg), 0) != sizeof(ComMsg)) 
    DieWithError("send() sent a different number of bytes than expected"); 

とサーバ側の

:事前に

recv(clntSocket_fd, &_commsg, sizeof(ComMsg), 0); 

おかげでここでは、コードの関連するスニペットがあります。

+1

'&_commsg' ???? –

+1

重要な行方不明があるか、コンパイラが本当に奇妙なことがありますか? –

+0

はソケットIDが有効ですか?一体何が '_commsg'ですか?より多くのコードを提供してください。 –

答えて

0

send(2)のマニュアルページに記載されているように、「send() とwrite(2)の唯一の違いは、フラグの存在です.send()は、 ) "

彼のUnixネットワークプログラミングブックでStevensが述べたように。 「ストリーム ソケット(例えば、TCPソケット)は、読み取りでの挙動を示し、通常のファイルI/Oとは異なり 関数を記述します。読み取りや入力または出力バイト以下要求されたかもしれないより ストリームソケットに書き込む」

このようにしてエラーをテストすると、次のようになります。

if (send(sock_id, (void *)&_commsg, sizeof(ComMsg), 0) < 0) 

送信されたバイトをテストしません。実際に問題がない場合は、アプリケーション を閉じている可能性があります。

というアイデアは、 を他のシステムと接続するときにエンディアンに関連する問題に陥る可能性があるため、通常は良い数字ではありません。バイト文字列を使用するのが望ましい方法です。

1

アプリケーションを完全な警告でコンパイルしていますか(gcc、-Werrorなど)?あなたがすべき。バスエラーは、間違ったポインタにアクセスしていることを意味し、関数に渡すパラメータのAPIに違反していることを意味します。完全な警告を出してコンパイルしてください。エラーがあれば修正してください。 。

ちなみに、TCPソケットでは、send(2)とrecv(2)よりもread(2)とwrite(2)がよく使われます。

+2

また、 'valgrind'を試してください –

0

strace -esendまたはgdbでクライアントを実行している可能性があります。

関連する問題