Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 27th, 2012  |  syntax: None  |  size: 3.84 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. UDP Socket programming - fork server on recev
  2. // socket file descriptor (socket descriptor)
  3. int socket_fd;
  4. // serverTCP and client addresses
  5. struct sockaddr_in server_addr, client_addr;
  6. socklen_t sin_size;
  7. int bytes_read;
  8. char recv_data[1024];
  9.  
  10. // create the socket
  11. if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
  12.     perror("UDP Server: ERROR while creating the socket.n");
  13.     exit(1);
  14. }
  15.  
  16. // define the socket address associated with the created socket
  17. // set the server address and port number
  18.  
  19. // set the binding of the serverUDP socket
  20. printf("nUDP Server: server socket binding...");
  21. if (bind(socket_fd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) == -1) {
  22.     perror("UDP Server: ERROR while binding the socket.n");
  23.     exit(1);
  24. }
  25. printf("nUDP Server: done binding.");
  26.  
  27. sin_size = sizeof(struct sockaddr);
  28. // block and wait for connection request
  29. int pid; // process ID for forking new serverUDP process
  30. while (1) {
  31.     printf("nUDP Server: waiting for connection...");
  32.     bytes_read = recvfrom(socket_fd, recv_data, 1023, 0,
  33.             (struct sockaddr *) &client_addr, &sin_size);
  34.  
  35.     // a connection has been established
  36.     recv_data[bytes_read] = '';
  37.     printf("nUDP Server: received -> %s", recv_data);
  38.     pid = fork();
  39.  
  40.     if (pid < 0) {
  41.         perror("UDP Server: ERROR while forking new process.n");
  42.         exit(1);
  43.     }
  44.     // check if the process ID is zero
  45.     if (pid == 0) {
  46.         // we are now inside the new forked process
  47.         char result[50];
  48.         int len = sprintf(result, "%d", server_parse_command(recv_data));
  49.         len = sendto(socket_fd, result, len, 0,
  50.                 (struct sockaddr *) &client_addr, sin_size);
  51.         close(socket_fd);
  52.         exit(0);
  53.     }
  54. }
  55.        
  56. int socket_fd;
  57. struct sockaddr_in server_addr;
  58. struct hostent *host;
  59. host = gethostbyname("127.0.0.1");
  60.  
  61. // create the socket
  62. if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
  63.     perror("UDP Client: ERROR while creating the socket.n");
  64.     exit(1);
  65. }
  66. // define the socket address associated with the created socket
  67.     // set the client address and port number
  68.  
  69. // send messages to the server socket
  70. int count;
  71. char buffer[128];
  72. while (1) {
  73.     socklen_t sin_size = sizeof(struct sockaddr);
  74.     // read message to send to the server and set count to the length of the message
  75.  
  76.     count = sendto(socket_fd, buffer, count, 0,
  77.             (struct sockaddr *) &server_addr, sizeof(struct sockaddr));
  78.     if (count < 0) {
  79.         perror("UDP Client: ERROR while writing message to server socket.n");
  80.         exit(1);
  81.     }
  82.     bzero(buffer, 128);
  83.     count = recvfrom(socket_fd, buffer, 127, 0,
  84.             (struct sockaddr *) &server_addr, &sin_size) ;
  85.  
  86.     if (count < 0) {
  87.         perror("UDP Client: ERROR while reading response from server socket.n");
  88.         exit(1);
  89.     }
  90.     buffer[count] = '';
  91.     printf("nUDP Client: received response -> %s", buffer);
  92.     close(socket_fd);
  93. }
  94.        
  95. while (1) {
  96.     printf("nUDP Server: waiting for connection...");
  97.     bytes_read = recvfrom(socket_fd, recv_data, 1023, 0,
  98.             (struct sockaddr *) &client_addr, &sin_size);
  99.  
  100.     if (bytes_read > 0) {
  101.                 // a connection has been established
  102.             recv_data[bytes_read] = '';
  103.                 printf("nUDP Server: received -> %s", recv_data);
  104.             pid = fork();
  105.  
  106.             if (pid < 0) {
  107.                 perror("UDP Server: ERROR while forking new process.n");
  108.                 exit(1);
  109.             }
  110.             // check if the process ID is zero
  111.             if (pid == 0) {
  112.                 // we are now inside the new forked process
  113.                 char result[50];
  114.                 int len = sprintf(result, "%d", server_parse_command(recv_data));
  115.                 len = sendto(socket_fd, result, len, 0,
  116.                 (struct sockaddr *) &client_addr, sin_size);
  117.                 close(socket_fd);
  118.                 exit(0);
  119.             }
  120.     }
  121. }