// Run like this: simple_client address port // Results in argv ["./simple_client", "address", "port"] #include #include #include #include #include #include #include #include #include void* print_reports(void* p){ static char d_buffer[65536]; int fd = *(int*)p; while(1){ uint16_t dlen; ssize_t readlen = read(fd, &dlen, 2); if(readlen != 2) break; recv(fd, d_buffer, dlen, MSG_WAITALL); puts(d_buffer); } } int main(int argc, char ** argv){ if(argc < 3){ printf("Usage: %s hostname port\n", argv[0]); return 1; } struct sockaddr_in sad; sad.sin_port = htons(atoi(argv[2])); sad.sin_family = AF_INET; int skt = socket(AF_INET, SOCK_STREAM, 0); // do a dns lookup struct hostent* entry = gethostbyname(argv[1]); if(!entry){ if(h_errno == HOST_NOT_FOUND){ printf("This is our own message that says the host wasn't found\n"); } herror("gethostbyname"); return 1; } struct in_addr **addr_list = (struct in_addr**)entry->h_addr_list; struct in_addr* c_addr = addr_list[0]; char* ip_string = inet_ntoa(*c_addr); sad.sin_addr = *c_addr; // copy the address we found into sad // Finally done with DNS! printf("Connecting to: %s\n", ip_string); if( connect(skt, (struct sockaddr*)&sad, sizeof(struct sockaddr_in)) ){ perror("connect"); return 1; } pthread_t thread_handle; pthread_create(&thread_handle, 0, print_reports, &skt); char input_buffer[65536]; while(1){ write(1, "Observe>> ", 10); ssize_t readlen = read(0, input_buffer, 65535); input_buffer[readlen - 1] = 0; uint16_t dlen = readlen; write(skt, &dlen, 2); write(skt, input_buffer, dlen); printf("Sent a report to the server\n"); } close(skt); return 0; }