コマンドを使用して、C言語を使用してLinuxのソケット経由でデータを送信しています
send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
手順は次のとおりです。
- ソケットの作成
- サーバーに接続
- while (条件): データを送信
このプログラムを Linux 環境で実行した場合、接続されていれば問題ありません。しかし、実行時に接続に失敗した場合に対処するために、いくつかのケースを確認し、次のような結果を得ました。
ケース 1:
- ソケット作成:作成なし(コメントアウト作成機能)
- サーバーへの接続:接続なし(コメントアウト接続機能)
- データの送信 -->失敗(-1 を返す) がクラッシュなし
ケース 2:
- ソケットの作成: 成功
- サーバーへの接続: 失敗または接続なし (コメントアウト接続機能)
- データを送信 -->クラッシュ
そして、サーバーに接続せずにソケットの3つの異なる値を試しました
ケース 3:
- ServerSocket = -1 --> データの送信: 失敗
- ServerSocket = 0 --> データ送信: 失敗
- 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)
{...}