# Codes ### Q1 ``` #include <unistd.h> #include <string.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #include <netinet/in.h> #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> using namespace std; int main(){ int sockfd, n; sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); char buffer[10000]; if(sockfd < 0){ printf("Error in creating socket.\n"); return 0; } printf("Socket created.\n"); struct sockaddr_in cli, ser; socklen_t len = sizeof(struct sockaddr_in); while(1){ n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cli, &len); printf("Received %d bytes.\n", n); struct iphdr* ip_hdr = (struct iphdr*)buffer; printf("Length of IP header is %d.\n", (ip_hdr->ihl)*4); struct icmphdr* icmp_hdr = (struct icmphdr*)((char *)ip_hdr + (ip_hdr->ihl)*4); printf("Message type is %d.\n", icmp_hdr->type); } return 0; } ``` ### Q2 server ``` #include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <netinet/in.h> int main(int argc, char **argv){ int sockfd, connfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd<0) printf("OHOH.\n"); printf("Socket created.\n"); struct sockaddr_in ser, cli; memset(&ser, 0, sizeof(struct sockaddr_in)); ser.sin_family = AF_INET; ser.sin_addr.s_addr = htonl(INADDR_ANY); ser.sin_port = htons(6011); // socklen_t len = sizeof(cli) bind(sockfd, (struct sockaddr*)&ser, sizeof(ser)); listen(sockfd, 2); printf("Istening.\n"); while(1){ socklen_t len = sizeof(cli); connfd = accept(sockfd, (struct sockaddr*)&cli, &len); printf("Accepted.\n"); int childpid; if((childpid = fork()) == 0){ close(sockfd); char msg1[10000]; int n1 = read(connfd, msg1, sizeof(msg1)); write(connfd, msg1, sizeof(msg1)); close(connfd); return 0; } close(connfd); } close(sockfd); return 0; } ``` ### Q2 client ``` #include <stdio.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <arpa/inet.h> int main(int argc, char **argv){ int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in ser, cli; memset(&ser, 0, sizeof(struct sockaddr_in)); ser.sin_family = AF_INET; ser.sin_addr.s_addr = inet_addr(argv[1]); ser.sin_port = htons(6011); connect(sockfd, (struct sockaddr*)&ser, sizeof(ser)); char buffer[10000]; fgets(buffer, sizeof(buffer), stdin); int n = strlen(buffer); write(sockfd, buffer, n); n = read(sockfd, buffer, 512); if(n<0) printf("Error reading.\n"); buffer[n] = 0; fputs(buffer, stdout); return 0; } ```