毛のはえたようなもの

インターネット的なものをつらつらとかきつらねる。

ネットワークプログラミング課題2

ソケットを開いて受信した相手のデータを表示し続けるだけのプログラム。
ソース汚い&C言語正規表現使えないらしいのでC++に乗り換えようかと思っているところ。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORT 5555

void err_check(int res, char function_name[]);
void socket2(int new_socket1);

int main(int argc , char* argv[]){
        // socket
    int new_socket1;
    new_socket1 = socket(AF_INET, SOCK_STREAM, 0);
    err_check(new_socket1, "socket");
    
    //bind
    struct sockaddr_in a;
    a.sin_family = AF_INET;
    a.sin_addr.s_addr= INADDR_ANY;
    a.sin_port = htons(PORT);
    
    int bind_ok;
    bind_ok = bind(new_socket1, (struct sockaddr *)&a, sizeof(a));
    err_check(bind_ok,"bind");

    //listen
    int listen_ok;
    listen_ok = listen(new_socket1,16);
    err_check(listen_ok,"listen");
    
    while(1){
        socket2(new_socket1);
    }
    close(new_socket1);
    return 0;
}

// socket2
void socket2(int new_socket1){
    // accept
    int new_socket2;
    int IPadd_len;
    struct sockaddr_in IPaddr;
    new_socket2 = accept(new_socket1,(struct sockaddr *)&IPaddr,&IPadd_len);
    err_check(new_socket2,"socket2");
    
    //recv
    ssize_t recv_ok;
    int data_size = 1000;
    char rcv_data[1000] = "";
    recv_ok = recv(new_socket2, rcv_data, data_size, 0);
    err_check(recv_ok,"recv");
    
    char line[1000];
    char path[100];
    int kaigyo = 0 ;
    char* p;
    strcpy(line, strtok(rcv_data,"\n"));
    while(line != NULL){
        
        if(isprint(line[0])== 0){
            kaigyo = 1;
        }else{
            kaigyo =0;
            if(strncmp("GET",line,3)==0){
                sscanf(line,"GET %s HTTP/1.1", path);
            }
        }
        
        if(kaigyo ==1){
            if((p =strtok(NULL,"\n"))==NULL){
                break;
            }else{
                strcpy(line,p);
            }
        }
        strcpy(line, strtok(NULL,"\n"));
    }
    
    char string[1000] ="";
    sprintf(string,"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"><html><head></head><body>path::: %s <br />IP::: %s<br />PORT::: %d <br /></body></html>\n",path,inet_ntoa(IPaddr.sin_addr),ntohs(IPaddr.sin_port));
    //send
    ssize_t send_ok;
    send_ok = send(new_socket2, string, strlen(string), 0);
    err_check(send_ok,"send");
    //close
    close(new_socket2);
}


//  error
void err_check(int res , char function_name[]){
    if(-1 == res){
        printf("%s  :\n",function_name);
        perror("");
        exit(1);
    }
}