#include #include #include #include #include #include #include #include int main(int argc, char ** argv){ struct sockaddr_in sad; if(argc > 1) sad.sin_port = htons(atoi(argv[1])); else sad.sin_port = htons(5143); sad.sin_addr.s_addr = INADDR_ANY; sad.sin_family = AF_INET; int skt = socket(AF_INET, SOCK_STREAM, 0); // Step 1 if(skt == -1){ perror("socket"); return 1; } if( bind(skt, (struct sockaddr*)(&sad), sizeof(struct sockaddr_in)) ){ // step 2 perror("bind"); return 1; } if( listen(skt, 5) ){ // step 3 perror("listen"); return 1; } while(1){ int client_fd; struct sockaddr_in client_address; socklen_t address_size = sizeof(struct sockaddr_in); client_fd = accept(skt, (struct sockaddr *)(&client_address), &address_size); // step 4 printf("Connection made from address %s\n", inet_ntoa(client_address.sin_addr)); int32_t from_client[2]; from_client[0] = -999; from_client[1] = -999; ssize_t readlen = recv(client_fd, &from_client, 8, MSG_WAITALL); if(readlen == 8) { printf("Client sent: %d and %d\n", from_client[0], from_client[1]); printf("As text, client sent %s\n", &from_client); int32_t result = from_client[0] + from_client[1]; printf("The sum is %d\n", result); write(client_fd, &result, 4); } else puts("Not enough data! Giving up!"); close(client_fd); } return 0; }