LINUXの下でどのようにTCPクライアントとサーバーを作成して、通信を実現します


      TCP           

1.socketは、LINUX下のプロセス間通信に属するBSD(socket)ソケットである.同じホスト間のプロセス間通信を実現するか、異なるホスト間のプロセス間通信を実現するか、オペレーティングシステムがアプリケーションに提供するネットワーク通信用のインタフェースでもある.Linuxでは、すべてファイルなので、socketもファイルです.ファイル記述子で操作できます.2.IP番号:ホストの唯一のID.サブネットマスク:パケットが外部ネットワークに送信されるか、内部ネットワークに送信されるかを判断します.IPアドレスは、使用時にバイナリ形式(inet_addr)に変換する必要があります.対応するポート番号変換(htons);IPはホストを区別し、ポート番号はプロセスを区別する.3.クライアントの作成(対応する関数)(1)SOCKETソケット(socket)(2)バインディングアドレス情報(bind)の作成(このステップは省略可能で、システムは自動的に割り当てる)(3)接続要求(connect)(4)送受信メッセージ(send/recv)(5)ソケット(close)4を閉じる.サーバの作成(対応する関数)(1)SOCKETソケットの作成(2)バインドアドレス情報(bind)(サーバ対応IPアドレスとポート番号)(3)リスニングキューの作成(4)接続要求(accept)(5)送受信消息(send/recv)(6)クローズソケットの書き込みが悪い大目に見てほしい.具体的なコードクライアントxldClient.c以下:
#include 
#include 
#include 
#include 
#include 
#include 


int main()
{
    //  Internet    ,    IP  
     struct sockaddr_in myaddr;
     memset(&myaddr,0,sizeof(myaddr));
     myaddr.sin_family = PF_INET;
     myaddr.sin_port = htons(1314);
     myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  //1.     
   int clientId = socket(PF_INET,SOCK_STREAM,0);
   if(clientId<0)
   {
    perror("socket
"
); return -1; } printf("socket ok
"
); //2 int ret = connect(clientId,(struct sockaddr *)&myaddr,sizeof(myaddr)); if(ret <0) { perror("connect
"
); close(clientId); return -1; } printf("connect ok
"
); // 3 while(1) { char buf[1024]; memset(buf,0,1024); ret = recv(clientId,buf,sizeof(buf),0); if(ret<0) { perror("recv
"
); close(clientId); return -1; } printf("received from xldserver:%s
"
,buf); memset(buf,0,1024); printf("xldclient: "); gets(buf); if(strcmp(buf,"quit")==0) { break; } ret=send(clientId,buf,sizeof(buf),0); if(ret<0) { perror("send
"
); close(clientId); return -1; } } //4. close(clientId); return 0; }

次に、サーバの具体的なコードxldServerを示す.c以下
#include 
#include 
#include 
#include 
#include 
#include 
int main()
{
    //  Internet    ,        IP  
     struct sockaddr_in myaddr;
     memset(&myaddr,0,sizeof(myaddr));
     myaddr.sin_family = PF_INET;
     myaddr.sin_port = htons(1314);
     myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  //1.     
   int serverId = socket(PF_INET,SOCK_STREAM,0);
   if(serverId<0)
   {
    perror("serverFd
"
); return -1; } printf("socket ok
"
); //2. int ret = bind(serverId,(struct sockaddr *)&myaddr,sizeof(myaddr)); if(ret<0) { perror("bind
"
); close(serverId); return -1; } printf("bind ok
"
); //3. if(listen(serverId,10)<0) { perror("listen
"
); close(serverId); return -1; } printf("listening....
"
); //4. int conId=accept(serverId,NULL,NULL); if(conId<0) { perror("accept
"
); close(serverId); return -1; } printf("accept ok
"
); //5. while(1) { char buf[1024]; memset(buf,0,1024); printf("please input message (to xldclient)
"
); gets(buf); if(strcmp(buf,"quit")==0) { break; } ret = send(conId,buf,sizeof(buf),0); if(ret <0) { perror("send
"
); close(serverId); close(conId); return -1; } ret = recv(conId,buf,sizeof(buf),0); if(ret<0) { perror("recv
"
); close(serverId); close(conId); return -1; } printf("from xldclient:%s
"
,buf); } //6. close(serverId); close(conId); return 0; }