Linux 13网络服务器与客户端ser,cli

1.网络编程

1.1基本概念

目的:
实现进程间的通信
网络:
把多个主机连接起来,构成一个网络,
互联网:
把网络和网络 连接起来就构成了互联网。
ip:
在网络中唯一标示一台主机
端口:
在某个主机上唯一标示一个进程。

1.2网络模型

Linux 13网络服务器与客户端ser,cli
Linux 13网络服务器与客户端ser,cli

2.tcp编程流程

Linux 13网络服务器与客户端ser,cli

3. tcp实现

3.1tcp

ser.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr,caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);

    listen(sockfd,5);//creat listen list;
    //finished sharked,unfinished~,list
    
    while(1)
    {
        int len =sizeof(caddr);
        int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//link taojiezi
        if(c<0)
        {
            continue;
        }

        printf("accept c=%d,ip=%s,port=%d\n",c,inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
        while(1)
        {
            char buff[128]={0};
            //int n=recv(c,buff,127,0);//n==0,close;
            int n=recv(c,buff,1,0);//n==0,close;
            if(n<=0)
            {
                break;
            }
            printf("buff==%s\n",buff);
            send(c,"ok",2,0);
        }
        printf("one client over!!\n");
        close(c);
        
   }


}

cli.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");

    int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);
    while(1)
    {
        char buff[128]={0};
        printf("input:\n");
        fgets(buff,128,stdin);

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

        send(sockfd,buff,strlen(buff),0);
        memset(buff,0,128);
        recv(sockfd,buff,127,0);
        printf("buff==%s\n",buff);
    }
    close(sockfd);
}

3.2fork的tcp

fork_ser.c

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<signal.h>
void sig_fun(int sig)
{
    int val=0;
    wait(&val);
    //waitpid(-1,&val,0);
}
int main()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr,caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.1");

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);

    listen(sockfd,5);
    //signal()
    while(1)
    {
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }
        pid_t pid =fork();
        if(pid==-1)
        {
            close(c);
            continue;
        }
        if(pid==0)
        {
            while(1)
            {
                char buff[128]={0};
                int n=recv(c,buff,127,0);
                if(n<=0)
                {
                    break;
                }
                printf("buff==%s",buff);
                send(c,"ok",2,0);

            }
            close(c);
            printf("one client over\n");
            //exit(0);
        }
    }


}


3.3thread的tcp

///1.thread_ser.c
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>
#include<sys/socket.h>//
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>

void *thread_fun(void *arg)
{
    int c=(int)arg;
    while(1)
    {
        char buff[128]={0};
        int n=recv(c,buff,127,0);
        if(n<=0)
        {
            break;
        }
        printf("recv(%d)=%s\n",c,buff);
        send(c,"ok",2,0);
    }
    close(c);
    printf("one cilent over\n");
}
int main()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr,caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.1");

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);

    listen(sockfd,5);
    while(1)
    {
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }
        pthread_t id;
        pthread_create(&id,NULL,thread_fun,(void *)c);
    }

   // exit(0);

}

2.thread_cli

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.1");

    int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);
    while(1)
    {
        char buff[128]={0};
        printf("input:\n");
        fgets(buff,128,stdin);

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

        send(sockfd,buff,strlen(buff),0);
        memset(buff,0,128);
        recv(sockfd,buff,127,0);
        printf("buff==%s\n",buff);
    }
    close(sockfd);
}

4. udp的实现

4.1udp_ser

#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
int main()
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr,caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.1");

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);

    while(1)
    {
        int len=sizeof(caddr);
        char buff[128]={0};
        int n=recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len);
        if(n==-1)
        {
            continue;
        }
        printf("port:%d,buff==%s\n",ntohs(caddr.sin_port),buff);

        sendto(sockfd,"0k",2,0,(struct sockaddr*)&caddr,sizeof(caddr));

    }


}

4.2udp_cli

#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
int main()
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in saddr,caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.1");

    while(1)
    {
        char buff[128]={0};
        printf("input:\n");

        fgets(buff,128,stdin);
        if(strncmp(buff,"end",3)==0)
        {
            break;
        }
        sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)&saddr,sizeof(saddr));

        int len =sizeof(saddr);
        memset(buff,0,128);

        recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);
        printf("buff==%s\n",buff);

    }
    //close(s);


}

5.myhttp.c

  1 #include<stdio.h>
  2 #include<assert.h>
  3 #include<unistd.h>
  4 #include<string.h>
  5 #include<sys/socket.h>
  6 #include<arpa/inet.h>
  7 #include<netinet/in.h>
  8 #include<fcntl.h>
  9 //#define IPSTR   "192.168.228.128"
 10 #define IPSTR   "127.0.0.1"
 11 #define PORT 80
 12 #define BUFSIZE 1024
 13 int creat_socket();
 14 int main()
 15 {
 16     int sockfd=creat_socket();
 17     assert(sockfd!=-1);
 18     while(1)
 19     {
 20         struct sockaddr_in caddr;
 21         int len=sizeof(caddr);
 22 
 23         int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
 24         char buff[BUFSIZE]={0};
 25 
 26         int n=recv(c,buff,BUFSIZE-1,0);
 27         printf("recv(%d):%s\n",n,buff);
 28 
 29         char *s=strtok(buff," ");
 30         if(s==NULL)
 31         {
 32             close(c);
 33             continue;
 34         }
 35         printf("method %s\n",s);//GET;
 36         s=strtok(NULL," ");
 37 
 38         char path[128]={"/home/yhx/study/19linux/k0411"};//path
 39         if(strcmp(s,"/")==0)
 40         {
 41             strcat(path,"/index.html");
 42         }
 43         else
 44         {
  45             strcat(path,s);
 46         }
 47         //send(c,"hello gy1802/1803",17,0);
 48         int fd=open(path,O_RDONLY);
 49         if(fd==-1)
 50         {
 51             char res_buff[128]={"HTTP/1.1 404 not found\r\n"};
 52             strcat(res_buff,"Service:myhttp\r\n");
 53             strcat(res_buff,"Content-length:3\r\n");
 54             strcat(res_buff,"\r\n");
 55             strcat(res_buff,"404");
 56             send(c,res_buff,strlen(res_buff),0);
 57             close(c);
 58             continue;
 59 
 60         }
 61         int size=lseek(fd,0,SEEK_END);
 62         lseek(fd,0,SEEK_SET);
 63         char head_buff[256]={"http/1.1 200 ok\r\n"};
 64         strcat(head_buff,"Service: myhttp\r\n");
 65         sprintf(head_buff+strlen(head_buff),"content Length:%d\r\n",size);
 66         strcat(head_buff,"\r\n");
 67 
 68         send(c,head_buff,strlen(head_buff),0);
 69         printf("\nsend:\n%s\n",head_buff);
 70 
 71         char data[1024]={0};                          
    72         int sum=0;
 73 
 74         while(sum=read(fd,data,1025)>0)
 75         {
 76             send(c,data,sum,0);
 77         }
 78         close(fd);//daun link
 79         close(c);
 80     }
 81 }
 82 int creat_socket()
 83 {
 84     int sockfd=socket(AF_INET,SOCK_STREAM,0);
 85     struct sockaddr_in saddr;
 86     memset(&saddr,0,sizeof(saddr));
 87     if(sockfd==-1)
 88     {
 89         return -1;
 90     }
 91     //:struct sockaddr_in saddr;
 92     saddr.sin_family=AF_INET;
 93     saddr.sin_port=htons(PORT);
 94     saddr.sin_addr.s_addr=inet_addr(IPSTR);
 95 
  96     int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
 97     if(res ==-1)
 98     {
 99         return -1;
100     }
101     listen(sockfd,20);
102     return sockfd;
103 }
104 
                                                                                                                                                                 

然后再写HTML文件,就可以访问自己写的网页。

上一篇:linux网络编程--socket编程(基本概念,转换操作,sockaddr)


下一篇:【ZJOI2010 Day1】网络扩容