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);
}