3

TCP/IP を介してクライアントにデータを書き込み続けるループがあります。接続は次のように開かれます。

newsockfd = accept(sockfd,
            (struct sockaddr *) &cli_addr,
            &clilen);

次の行は、クライアントにデータを書き込むためにループ (0.1 秒のスリープ) で連続的に実行されます。

n = write(newsockfd,data.c_str(),data.length()+1); //+1 to include NULL in null terminated string
if(n>=0)
{
    cout<<"success"<<endl;
}
else
{
    cout<<"Fail"<<endl;
    close(newsockfd);
    newsockfd = -1;
}

なんらかの理由で接続が切断された場合に、サーバーが新しい接続を受信できるようにしたい。そのため、書き込みに失敗した場合は、最初のコマンドで新しい接続を受け入れる準備を再度整えます。

私の問題は次のとおりです。メソッドは初めて成功するため、クライアントからの接続が切断された場合、 write() は負の数を返し、接続に問題があることがすぐにわかるので、それを閉じて新しい1。サーバーは新しい接続を受け取りますが、次に write() を使用すると、プログラムはすぐにクラッシュします。

なぜこれが起こるのですか?助けてください、私はTCP / IPの初心者です。

必要な場合は、詳細をお尋ねください。

ヘルパーからのリクエスト:

スタックトレース:

エラー: シグナル 13:

    /mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x402155]
    /lib/x86_64-linux-gnu/libc.so.6(+0x364a0)[0x7ffc57ac04a0]
    /lib/x86_64-linux-gnu/libpthread.so.0(write+0x10)[0x7ffc5836dcb0]
    /mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x4023b6]
    /mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x401b54]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ffc57aab76d]
    /mnt/hgfs/Dropbox/common_src/LinuxTCP/Server/ServerLinux-build-desktop-Qt_4_8_1_in_PATH__System__Release/ServerLinux[0x402081]

変数の定義: それはクラスです:

体:

int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;

コンストラクターは次のものを開始します。

LinuxTCPServer::LinuxTCPServer(int port, bool nonblocking)
{
if(nonblocking)
    sockfd = socket(AF_INET, SOCK_NONBLOCK | SOCK_STREAM, 0);
else
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0)
   error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = port;

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

if (bind(sockfd, (struct sockaddr *) &serv_addr,
         sizeof(serv_addr)) < 0)
         error("ERROR on binding");

listen(sockfd,5);
clilen = sizeof(cli_addr);
}
4

2 に答える 2