// Run like this: simple_client address port // Results in argv ["./simple_client", "address", "port"] #include #include #include #include #include #include #include #include #include #include #include "scolor.h" int skt; void* thread_one(void* p){ char buffer[1024*16]; ssize_t readlen, sofar = 0; while(0 < (readlen = recv(skt, buffer, sizeof(buffer), MSG_WAITALL))){ sofar += readlen; buffer[32] = 0; printf("Thread "YELLOW("one")" received %ld bytes (%ld sofar): %s\n", readlen, sofar, buffer); } return 0; } void* thread_two(void* p){ char buffer[1024*16]; ssize_t readlen, sofar = 0; while(0 < (readlen = read(skt, buffer, sizeof(buffer)))){ sofar += readlen; buffer[32] = 0; printf("Thread "GREEN("two")" received %ld bytes (%ld sofar): %s\n", readlen, sofar, buffer); } return 0; } 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; skt = socket(AF_INET, SOCK_STREAM, 0); 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; printf("Connecting to: %s\n", ip_string); if( connect(skt, (struct sockaddr*)&sad, sizeof(struct sockaddr_in)) ){ perror("connect"); return 1; } pthread_t t1, t2; pthread_create(&t1, 0, thread_one, 0); pthread_create(&t2, 0, thread_two, 0); pthread_join(t1, 0); pthread_join(t2, 0); close(skt); return 0; }