Linuxの下でTCPネットワークのプログラミングの流れ

7639 ワード

一般的な2つのモデル:C/Sモデル:(クライアント/サーバ側)とptp(ポイント対ポイント)モデル.
以下に、TCPネットワークフロープログラミング2台のホスト間のデータ転送の具体的なコード例を示す.コード例:ファイルserver.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

void main()
{
    //  socket
    int sock=socket(PF_INET,SOCK_STREAM,0);//                  ,  tcp    ,     PF—INET  IPv4,PF—INET6  IPv6;               ,           ,   0;
    assert(sock!=-1);

    struct sockaddr_in ser,cli;//ser   ,cli   
    memset(&ser,0,sizeof(&ser));
    ser.sin_family= AF_INET;//   
    ser.sin_port=htons(6500);//   (     , short  )
    ser.sin_addr.s_addr=inet_addr("127.0.0.1");//IP  

    //  socket
    int res=bind(sock,(struct sockaddr*)&ser,sizeof(ser));
    assert(res!=-1);

    //  socket
    listen(sock,5);

    while(1)
    {
        int len=sizeof(cli);
        //    
        int c=accept(sock,(struct sockaddr*)&cli,&len);
        assert(c!=-1);
        printf("one client link
"
); // while(1) { char buff[128]={0}; int n=recv(c,buff,127,0); if(n<=0) { printf("client link break
"
); break; } printf("buff:%s,n=%d
"
,buff,n); // send(c,"OK",2,0);// } close(c); } // close(sock); }

ファイルcli.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
void main()
{
    //  socket
    int sock=socket(PF_INET,SOCK_STREAM,0);//                  ,  tcp    ,     PF—INET  IPv4,PF—INET6  IPv6;               ,           ,   0;
    assert(sock!=-1);

    struct sockaddr_in ser,cli;//ser   ,cli   
    ser.sin_family = AF_INET;//   
    ser.sin_port=htons(6500);//   (     , short  )
    ser.sin_addr.s_addr=inet_addr("127.0.0.1");//IP  

    //  socket
    int res= connect(sock,(struct sockaddr*)&ser,sizeof(ser));//                   
    assert(res!=-1);

    while(1)
    {
        printf("please input: "),fflush(stdout);

        char buff[128]={0};
        fgets(buff,128,stdin);
        buff[strlen(buff)-1]=0;

        if(strncmp(buff,"end",3)==0)
        {
            break;
        }

    //    
    send(sock,buff,strlen(buff),0);
    memset(buff,0,128);//  
    //    
    recv(sock,buff,127,0);

    printf("%s
"
,buff); } // close(sock); }
    :
  gcc -o server server.c  
   ./server  ;
       ,
  gcc -o client client.c  
   ./client;
      :
 client  :
please input:hello
OK
please input:word
OK
please input:end
   ,  。
 server  :
one client link
buff:hello,n=5
buff:word,n=4
client link break