1

コマンドを使用して、C言語を使用してLinuxのソケット経由でデータを送信しています

send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);

手順は次のとおりです。

  1. ソケットの作成
  2. サーバーに接続
  3. while (条件): データを送信

このプログラムを Linux 環境で実行した場合、接続されていれば問題ありません。しかし、実行時に接続に失敗した場合に対処するために、いくつかのケースを確認し、次のような結果を得ました。

ケース 1:

  1. ソケット作成:作成なし(コメントアウト作成機能)
  2. サーバーへの接続:接続なし(コメントアウト接続機能)
  3. データの送信 -->失敗(-1 を返す) がクラッシュなし

ケース 2:

  1. ソケットの作成: 成功
  2. サーバーへの接続: 失敗または接続なし (コメントアウト接続機能)
  3. データを送信 -->クラッシュ

そして、サーバーに接続せずにソケットの3つの異なる値を試しました

ケース 3:

  1. ServerSocket = -1 --> データの送信: 失敗
  2. ServerSocket = 0 --> データ送信: 失敗
  3. ServerSocket = 4 --> データの送信:クラッシュ

送信に失敗した場合は正しいですが、他の場合にクラッシュした理由がわかりません。Windows で試してみましたが問題ありませんでした。これは Linux と Windows の違いですか? それは理にかなっていますか?ソケットを開いてサーバーに1回だけ接続し、その後データを1000回送信したいので、この場合「クラッシュ」が理にかなっている場合、接続に失敗した場合にこの問題をどのように修正できますか? 御時間ありがとうございます。

ケース 2 は次のとおりです (接続失敗のケースをテストするために、サーバーを停止して接続に失敗しました)。

ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP) ;
...
iResult = connect(ServerSocket,(struct sockaddrx *)&server , sizeof(server));
iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
if(iResult<0)
{...}

ケース 3 は次のとおりです。

    //ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP) ;
    ...
    //iResult = connect(ServerSocket,(struct sockaddrx *)&server , sizeof(server));
    ServerSocket = 0;
    iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
    log();
    ServerSocket = -1;
    iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
    log();
    ServerSocket = 4;
    iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
    log();
    if(iResult<0)
    {...}
4

2 に答える 2

0

ケース 2.3: これは失敗する必要があります。つまり、-1 が返され、それに付随するerrno.値が

ケース 3: FD 0 または 4 がたまたまソケットでない限り、これらはすべて失敗するはずです。

なぜあなたがこれをテストしているのか、私にはわかりません。「接続の失敗」は、そもそも接続されていないソケットとはまったく別のものです。「失敗した接続」は、接続されていない TCP ソケットsend(), recv(),に送信errnoするEAGAIN/EWOULDBLOCK.ことはできません。それを試してください。そうである場合、エラー処理コード パスが正しくありません。

于 2013-10-04T03:49:40.017 に答える