Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. Protocol Agreement: Lab11-RFC.pdf
  2. Description:
  3. Concurrent datagram (UDP) echo server S
  4. This server must send back any message you send to it.
  5. The server must "listen" on port 10010.
  6. The server must be able to handle concurrently multiple requests.
  7. */
  8.  
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <netinet/in.h>
  14. #include <arpa/inet.h>
  15. #include <string.h>
  16. #include <unistd.h>
  17. #include <time.h>
  18. #include <limits.h>
  19.  
  20. #define MAXLINE 1024
  21. #define PACKET_SIZE 1038
  22. #define SERV_PORT 10010
  23.  
  24. /* Global Variables */
  25. int sequence;
  26. char string[MAXLINE], packet[PACKET_SIZE];
  27. int sequenceNumber;
  28. short totalMessageLength;
  29. long timestamp;
  30.  
  31. void addSequenceNumber() {
  32. sequenceNumber = htonl(sequence);
  33. memcpy(packet + sizeof(short), &sequenceNumber, sizeof(int));
  34. }
  35.  
  36. void deconstructPacket() {
  37. memcpy(&totalMessageLength, packet, sizeof(short));
  38. totalMessageLength = ntohs(totalMessageLength);
  39. memcpy(&sequenceNumber, packet + sizeof(short), sizeof(int));
  40. sequenceNumber = ntohl(sequenceNumber);
  41. memcpy(&timestamp, packet + sizeof(short) + sizeof(int), sizeof(long));
  42. timestamp = be64toh(timestamp);
  43. memcpy(&string, packet + sizeof(short) + sizeof(int) + sizeof(long), MAXLINE);
  44. }
  45.  
  46. int main (int arc, char **argv) {
  47. int dataSocket, n;
  48. socklen_t clientLength;
  49. struct sockaddr_in clientSocketAddress, serverSocketAddress;
  50.  
  51. /* Create the socket with error detection */
  52. if ((dataSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  53. perror("Problem creating the socket");
  54. exit(2);
  55. }
  56.  
  57. /* Prepare for the socket address */
  58. memset(&serverSocketAddress, 0, sizeof(serverSocketAddress));
  59. memset(&clientSocketAddress, 0, sizeof(clientSocketAddress));
  60. serverSocketAddress.sin_family = AF_INET;
  61. serverSocketAddress.sin_addr.s_addr = INADDR_ANY;
  62. serverSocketAddress.sin_port = htons(SERV_PORT);
  63. clientLength = sizeof(clientSocketAddress);
  64.  
  65. if (bind(dataSocket, (struct sockaddr *) &serverSocketAddress, sizeof(serverSocketAddress)) < 0) {
  66. perror("Problem binding the socket");
  67. exit(3);
  68. }
  69.  
  70. printf("%s\n", "Server running... waiting for connections.");
  71.  
  72. sequence = 0;
  73. /* Client handler */
  74. for ( ; ; ) {
  75.  
  76. /* Recieve from a client */
  77. n = recvfrom(dataSocket, packet, PACKET_SIZE, MSG_WAITALL, (struct sockaddr *) &clientSocketAddress, &clientLength);
  78. printf("%s", "String received from and resent to the client: ");
  79.  
  80. deconstructPacket();
  81. puts(string);
  82.  
  83. /* Send back to a client */
  84. addSequenceNumber();
  85. if (n = sendto(dataSocket, packet, totalMessageLength, 0, (struct sockaddr *) &clientSocketAddress, sizeof(clientSocketAddress)) < 0) {
  86. perror("Problem adding the packet to the buffer");
  87. exit(4);
  88. }
  89.  
  90. /* Increment sequence number wrapping around to 0 at (2^32 - 1) */
  91. if (sequence < UINT_MAX) {
  92. sequence++;
  93. }
  94. else {
  95. sequence = 0;
  96. }
  97. }
  98. close(dataSocket);
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement