tcp/IPポイントツーポイント通信プログラム

21053 ワード

ポイントツーポイント通信
サーバ側とクライアントは、接続が確立された後にプロセスを作成します.
サーバ側:
サブプロセスは、ホストの入力を受信し、データを送信するために使用されます.親プロセスは、クライアントのデータを受信してホストに出力するために使用されます.
サブプロセスはホストの入力を待機し、入力したデータは送信キャッシュ領域に配置されます.入力がある場合は、入力データをクライアントに送信し、送信バッファを空にします.次回の入力長さが今回より短い場合、バッファ内で今回受信した数の後の数が消去に反するため、これらのデータは今回のデータとともに送信されるからである.サーバがシャットダウンすると、サブプロセスは終了し、破棄されます.
親プロセスはクライアントのデータを受信するのを待っています.受信したデータの数が0、すなわちクライアントが閉じると、親プロセスはwhileループを終了し、プロセスを破棄します.受信したデータが0より大きい場合、受信したデータはホストに出力されます.
#include
#include
#include
#include<string.h>
#include
#include
#include
#include      //*       */
#includein.h>
#include
 
 #define MAXLINE  50  //         
int main()
{
    int sock_fd,new_fd;//sock_fd    ,new_fd    
    struct sockaddr_in srv_addr;//        
    struct sockaddr_in client_addr;//        
    int size; //         
    pid_t  pid;  //   id
    ssize_t n;
    char buf[MAXLINE]; //         
    
    /*     */
    sock_fd=socket(AF_INET,SOCK_STREAM,0);//  IPv4  
    if(sock_fd==-1)
    {
        perror("creat socket failed");
        exit(1);
    }
    
    /*       */
    srv_addr.sin_family=AF_INET;  
    srv_addr.sin_port=htons(3490);
    srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bzero(&srv_addr.sin_zero,sizeof(struct sockaddr_in));//bzero     , sin_zero  ,sin_zero     ,      
    
    int on=1; //    reuseaddr
    if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0)  //
        perror("setsockopt");
    
    /*       */
    if(bind(sock_fd,(struct sockaddr*)&srv_addr,sizeof(struct sockaddr))==-1)
    {
        perror("bind failed");
        exit(1);
    }
    
    /*      
    if(connect(sock_fd,(struct sockaddr*)&srv_addr,sizeof(sock_fd))==-1)
    {
        perror("bind failed");
        exit(1);
    }*/
    
    /**/
    if((listen(sock_fd,5))==-1)
    {
        perror("listen failed");
        exit(1);
    }
    
    /*    ,           accep*/
    //while(1)
    //{
        size=sizeof(struct sockaddr_in);
        new_fd=accept(sock_fd,(struct sockaddr*)&client_addr,&size);
        if(new_fd==-1)
        {
            perror("accept failed");
            //continue;//restart accept when EINTR
        }
        
        printf("server:got connection from IP= %s prot= %d 
",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));// , IP /*char *inet_nota(struct sockaddr_in in); : arpa/inet.h Winsock2.h : IP : , , IP ( ); , NULL。 uint31_t ntohs(uint32_t net32bitvalue); : #include net32bitvalue 。 */ if(send(new_fd,"Hello client,I am 192.168.229.125!
",50,0)==-1) //192.168.229.125 IP, perror("send failed"); pid=fork(); // if(pid<0) perror("fork error
"); if(!pid)// , { // close(sock_fd);// while(fgets(buf,sizeof(buf),stdin)!=NULL) { write(new_fd,buf,strlen(buf)); memset(buf,0,sizeof(buf)); //// exit(EXIT_SUCCESS); } exit(EXIT_SUCCESS); } else //f= { char recvbuf[50]; //close(new_fd);// while(1) { memset(recvbuf,0,sizeof(recvbuf)); n=read(new_fd,recvbuf,MAXLINE); if(n==0) { printf("peer closed
"); break; } else if(n<0) perror("read from client error"); fputs(recvbuf,stdout); } exit(EXIT_SUCCESS); } //while(waitpid(-1,NULL,WNOHANG)>0);////} return 0; }

 
クライアント:
サブプロセスは、サーバのデータを受信してホストに出力するために使用されます.親プロセスは、ホストから入力されたデータを受信してサーバに送信するために使用されます.
 
#include
#include
#include
#include<string.h>
#include
#include
#include
#include      //*       */
#includein.h>
#include

#define MAXBYTEMUN   50
int main(int argc,char *argv[])
{
    int sock_fd,numbytes;
    char buf[MAXBYTEMUN];
    struct hostent *he;
    struct sockaddr_in client_addr;//        
    ssize_t n;

    if(argc!=2)
    {
        fprintf(stderr,"usage: client IPAddress
"); // , IP exit(1); } /* */ sock_fd=socket(AF_INET,SOCK_STREAM,0);// IPv4 if(sock_fd==-1) { perror("creat socket failed"); exit(1); } /* */ client_addr.sin_family=AF_INET; client_addr.sin_port=htons(3490); client_addr.sin_addr.s_addr=inet_addr(argv[1]); bzero(&client_addr.sin_zero,sizeof(struct sockaddr_in));//bzero , sin_zero ,sin_zero , /* */ if(connect(sock_fd,(struct sockaddr*)&client_addr,sizeof(struct sockaddr))==-1) { perror("connect failed"); exit(1); } if((numbytes=recv(sock_fd,buf,MAXBYTEMUN,0))==-1) { perror("receive failed"); exit(1); } buf[numbytes]='\0';// \0, printf("Received: %s
",buf); pid_t pid; pid=fork(); if(!pid)// , { char recvbuf[50]; while(1) { memset(recvbuf,0,sizeof(recvbuf)); n=read(sock_fd,recvbuf,MAXBYTEMUN); if(n==0) { printf("peer closed
"); break; } else if(n<0) perror("read from server error"); fputs(recvbuf,stdout); } //exit(EXIT_SUCCESS); close(sock_fd); } else //f= { //close(sock_fd);// while(fgets(buf,sizeof(buf),stdin)!=NULL) { write(sock_fd,buf,strlen(buf)); memset(buf,0,sizeof(buf)); //// exit(EXIT_SUCCESS); } //exit(EXIT_SUCCESS); close(sock_fd); } /* if((numbytes=recv(sock_fd,buf,MAXBTYEMUN,0))==-1) { perror("receive failed"); exit(1); } buf[numbytes]='\0';// \0, printf("Received: %s
",buf); close(sock_fd);
*/ return 0; }

 
転載先:https://www.cnblogs.com/wujing-hubei/p/5539676.html