LinuxのC言語のフォークソケットサーバは、バックショットを送信します

キー: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

おすすめ

転載: www.cnblogs.com/ip99/p/12126526.html