loops

アクセスカウンタ

help RSS Qtプログラミング(その4) ソケット通信

<<   作成日時 : 2010/12/28 16:41   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 4 / トラックバック 0 / コメント 0

4.ソケット通信 TCP編

TCP/IP通信でソケット関数を使用しているが、WINSOCKが少し特殊なために、OSの互換性を確保するための工夫が必要だ。これをQtを使うことによって解消したい。

(1)サーバー

サーバー側では、QTcpServerオブジェクトを定義して、クライアントによる接続をSIGNALとして、SLOT関数を定義する。

QTcpServer *tcpServer;
int port = 9999;

tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendData()));

これでクライアントの待ち受け状態になるので、SLOT関数sendData()を作成する。

まず最初に、接続してきたクライアントのソケットを取得する。

QTcpSocket *client = tcpServer->nextPendingConnection();

切断したときの処理としてSLOT関数を設定する。

connect(client, SIGNAL(disconnected()), client, SLOT(deleteLater()));

一応、クライアントのアドレスを取得する。

QString ippaddr = client->localAddress().toString();

送信データをストリームとして定義する。

QDataStream out(client);
out.setVersion(QDataStream::Qt_4_0);

データ送信。

QString f = "test data";
quint16 blockSize = f.size();

out << blockSize;
out << f;

(2)クライアント

クライアント側ソケットのオブジェクトの定義と、通信を開始したときのSLOT関数を定義する。

QTcpSocket *tcpSocket;

tcpSocket = new QTcpSocket(this);

connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));

SLOT関数readData()の内容は以下の通り。

受信データのためのストリームの作成。

QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);

受信データサイズとデータの受信

in >> blockSize;
QString s;
in >> s;

サーバーへの接続は以下の通り

tcpSocket->connectToHost(hostLineEdit->text(), portLineEdit->text().toInt());

(3)文字列の送信について

上記の例では、QTcpSocketをQDataStreamクラスのI/Oデバイスとすることによって、ストリーム内部で文字列を処理しているが、実際にどのようにデータが送られているか確認してみたところで、先頭の2バイトにバイト数+1の値が入り、その後は終端文字を含めた文字列を送信している。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 4
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
ナイス

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
Qtプログラミング(その4) ソケット通信 loops/BIGLOBEウェブリブログ
[ ]