// 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* listen_to_server(void* arg){ char type; ssize_t length; uint16_t name_length; char name[128]; while(1){ length = read(skt, &name_length, 2); if(length != 2) break; length = recv(skt, name, name_length, MSG_WAITALL); if(length != name_length) break; name[length] = 0; uint32_t message_length; length = read(skt, &message_length, 4); if(length != 4) break; char *message_buffer = (char*)malloc(message_length - 1); length = recv(skt, message_buffer, message_length, MSG_WAITALL); if(length != message_length) break; message_buffer[length] = 0; printf(DGREEN("%s:")" %s\n", name, message_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; } char buffer[1024]; ssize_t length; printf("Enter a name: \n"); length = read(0, buffer + 3, 127); length--; buffer[0] = 1; printf("Name length: %d\n", length); memcpy(buffer + 1, &length, 2); write(skt, buffer, length + 3); // Start a thread to listen for messages from the server pthread_t t; pthread_create(&t, 0, listen_to_server, 0); // User input thread while(1){ length = read(0, buffer + 5, 1019); length--; buffer[0] = 2; memcpy(buffer + 1, &length, 4); write(skt, buffer, length + 5); } close(skt); return 0; }