<sys/socket.h>
とQt Creator GUIビルダーを使用してC++でサーバーサンプルを作成しようとしていますが、プログラムのソケットレイヤーで2つの奇妙な動作が行われています。まずの、私は、サーバーを実行するが、私はtelnet
を使用して、それに接続するために作る最初の試みでimediately ... 127.0.0.1をしようと127.0.0.1に接続
を最初の接続試行を終了するC++ソケット
を閉じています。
エスケープ文字は '^]'です。
外部ホストによって接続が切断されました。
2回目の接続を試みると、それは動作し、端末は自分の入力を待ちます。もう一つは、接続を閉じるときです。私は右の後に再実行する場合は、ほんの数分で、プログラムが終了し、帰国bind
に一時的に停止させます。
ERROR結合に:すでに使用
で住所をだから私は多分、接続が開催されていると仮定関数呼び出しonCortarConexao()
を使用してブレークした後、またはデバッガを停止するだけです。とにかく、私は何が欠けていますか?
マイコード:MainWindow.cppオン
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
:
void MainWindow::on_pushButton_clicked()
{
socket1 = new MSocket();
socket1->start();
}
void MainWindow::on_pushButton_3_clicked()
{
socket1->onCortarConexao();
}
ソケットクラス:
#ifndef MSOCKET_H
#define MSOCKET_H
#include <QString>
#include <QObject>
#include <QThread>
#include <QList>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define SERVER_BUFFER 4096
#define PORTRUN 15000
class MSocket : public QThread
{
public:
MSocket();
void error(char *msg);
void onCortarConexao();
private:
int sockfd;
int newsockfd;
int portno;
int clilen;
int n;
char buffer[SERVER_BUFFER];
struct sockaddr_in serv_addr, cli_addr;
u_short port;
void run();
};
#endif // MSOCKET_H
ソケットの実装:
void MSocket::run()
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0){
error("ERROR opening socket");
exit(-1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = PORTRUN;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
serv_addr.sin_addr.s_addr = INADDR_ANY;
fprintf(stdout,"Iniciando servidor..");
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
error("ERROR on binding");
exit(-1);
}
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t*) sizeof(cli_addr));
if (newsockfd < 0){
error("ERROR on accept");
exit(-1);
}
bzero(buffer,SERVER_BUFFER);
n = read(newsockfd,buffer,SERVER_BUFFER-1);
if (n < 0)
error("ERROR reading from socket");
printf("Here is the message: %s",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0)
error("ERROR writing to socket");
}
void MSocket::onCortarConexao(){
printf("Encerrando socket");
close(newsockfd);
close(sockfd);
}
だから
thisは、それがgraphicaly WireSharkの(で見ることができ、telnetや私のQt Serverアプリケーション間の通信のパケットのリストです:https://github.com/FabioNevesRezende/BasicCppServer
編集1:
完全なコードはです.pcapngファイル)。それは11フレームを含んでいます。最初の6つは、即時に閉じられたときの最初のtelnetからのものです。フレーム4と5でアプリケーションが[FIN, ACK]
を送信し、サーバーが接続を閉じることによって応答したようです。フレーム7,8,9は接続する2番目の試みであり、フレーム10と11はサーバにabc
を送信するときです。印刷画面のように:
問題は、アプリケーションがそれがコード内でこのFIN
、どこを送信している理由を私は知らないです。 setsockopt
と
githubプロジェクト用に提供したリンクが壊れています。それがなければ、2回目の試行で何を意味するのかは、クライアント側でやり直すか、サーバーを再起動するかだけではわかりません。明確にできますか? – lasaro
申し訳ありませんが、もう一度やります。 – Fabiotk