ネットワークプログラミング課題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); } }