キー:2枚のFDを、子プロセスをフォークを受け入れ、親プロセスを共有し、一つは、FD、クライアントsocketfdを聞いています。
子供は受け入れ近いクライアントソケットへの親のニーズが継続され、FD、リスニングソケットのfdをクローズする必要があります。
このように、子供が読むことができますし、クライアントへの書き込み。
サーバーコードの.c
#includeは<sys / types.h>に する#includeは<sys / socket.h>に する#include <netinetの/ における .H> の#include <ARPA / inet.h> する#include <unistd.h> する#include <stdio.hの> 書式#include < 文字列の.h> の#include <stdlib.h>に含ま int型 = BUF_SIZE 1024 ; int型のmain() { int型serv_sockfd; int型client_sockfd; チャーBUF [BUF_SIZE]。 memset(BUF、0、はsizeof (BUF))。 構造体serv_addrのsockaddr_in。 構造体CLIENT_ADDRのsockaddr_in。 memset(&serv_addr、0、はsizeof (serv_addr))。 serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY。 serv_addr.sin_port = htons(8888 )。 もし((serv_sockfd =ソケット(AF_INET、SOCK_STREAM、0))< 0 ) { printf(" ソケットエラー!" ); リターン - 1 。 } もし(バインド(serv_sockfd、(構造体のsockaddr *)&serv_addr、はsizeof(serv_addr))< 0 ) { perrorは(" バインドエラー" ); リターン - 2 。 } もし((serv_sockfd、聞く5)< 0 ) { printf(" エラーを聞きます" ); リターン - 3 。 } 他{ printf(" リスニング.... " ); } socklen_t sin_size; sin_size = はsizeof (CLIENT_ADDR)。 / * *************************** 到着する新しいクライアント要求があるまで*後にサーバブロックを受け入れます * client_sockfdから読み取ると書き込みができ、クライアントのソケットポートである、受け入れ返さ *同時サーバーフォーク、server_sockfd、およびclient_sockfd後、(実際に参照カウントは2となる)、子と親プロセスのシェアの間になります *(キー)、その後親プロセスはソケットポートがすでに接続client_sockfd閉じ、リスニングソケットの子供は、子供がクライアントを動作させることができるように、親が受け入れることを続けることができ、口を閉じ、 *最後に、子供にも接続を閉じて処理を終了する返却する必要があります。 * * **************************** * / ながら(1 ) { もし((client_sockfd =受け入れる(serv_sockfd、(構造体のsockaddr *)&CLIENT_ADDR、&sin_size))< 0 ) { perrorは(" エラーを受け入れます!" ); リターン - 1 。 } もし(フォーク()== 0 ) { クローズ(serv_sockfd)。 INT LEN = RECV(client_sockfd、BUF、はsizeof(BUF)、0 ); printf(" %sの\ n " 、BUF)。 送信(client_sockfd、BUF、LEN、0 ); クローズ(client_sockfd)。 リターン - 1 。 } 他{ クローズ(client_sockfd)。 } } }
クライアントQT(C ++)
#include " mainwindow.h " の#include " ui_mainwindow.h " の#include <QHostAddress> 書式#include <QMessageBox> メインウィンドウ::メインウィンドウ(QWidgetの * 親): QMainWindow(親)、 UI(新しい宇井::メインウィンドウ) { UI - > setupUi(この); この - >ソケット= 新しいQTcpSocket(); この - > socket-> connectToHost(QHostAddress(" 127.0.0.1 ")、8888 ); この - >接続(これ - >ソケット、SIGNAL(接続())、このスロット(slotConn()))。 この - >接続(これ - >ソケット、SIGNAL(readChannelFinished())、このスロット(slotRecvid()))。 } メインウィンドウ::〜メインウィンドウ() { UI削除します。 } 無効メインウィンドウ:: slotConn() { QMessageBox ::(約この、" X "、" 连接成功" ); この - > socket->書き込み(" これはデータです!" ); } 無効メインウィンドウ:: slotRecvid() { QStringのS = この - > socket-> READALL(); ::についてQMessageBox(この、" 再帰反射サーバー" 、S); }
----------------
免責事項:この記事は元の記事CSDNブロガー「漢漢YH」で、次のCC 4.0 BY-SAの著作権契約、複製、オリジナルのソースとのリンクを添付してくださいこの文。
オリジナルリンクします。https://blog.csdn.net/u012997311/article/details/72614625