Forum: PC-Programmierung Fehler gegen sendto() zu andere server, den mit UDP socket verbindet ist


von B. S. N. (bs_n)


Lesenswert?

Hallo

Mein Programm kann nicht die erhaltene nachricht von ein Client zu 
anderen Server weiter schicken. Sie sind mit der UDP socket verbindet. 
Der code lautet wie es:
1
//Main SERVER
2
#include <sys/types.h>
3
#include <sys/socket.h>
4
#include <netinet/in.h>
5
#include <arpa/inet.h>
6
#include <stdio.h>
7
#include <unistd.h>
8
#include <errno.h>
9
#include <string.h>
10
#include <stdlib.h>
11
#include <sys/select.h>//use select() for multiplexing
12
#include <sys/fcntl.h> // for non-blocking
13
14
#define MAX_LENGTH 100000
15
#define PORT 1901
16
17
/* Select() params
18
 * int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
19
 * FD_SET(int fd, fd_set *set);
20
 * FD_CLR(int fd, fd_set *set);
21
 * FD_ISSET(int fd, fd_set *set);
22
 * FD_ZERO(fd_set *set);
23
*/
24
25
void error(char *message)
26
{
27
    perror(message);
28
    exit(1);
29
}
30
31
int main()
32
{
33
34
  // select parameters declared
35
  fd_set original_socket;
36
  fd_set original_stdin;
37
  fd_set readfds;
38
  fd_set writefds;
39
  struct timeval tv;
40
  int numfd, numfd2;
41
42
  // socket parameters declared
43
  int socket_fd_ob, socket_fd_hm;
44
  int bytes_read, bytes_sent;
45
  char address_length, address_length2;
46
  char recieve_data[MAX_LENGTH];
47
  char send_data[MAX_LENGTH];
48
  struct sockaddr_in server_address_ob, server_address_hm, client_address;
49
  int z = 0;
50
51
  //Socket creation done separately for both OB and HM communications
52
  if ((socket_fd_ob = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
53
  {
54
      error("socket()");
55
  }
56
  if ((socket_fd_hm = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
57
  {
58
      error("socket()");
59
  }
60
61
  
62
  fcntl(socket_fd_ob, F_SETFL, O_NONBLOCK); //set socket to non-blocking
63
  fcntl(socket_fd_hm, F_SETFL, O_NONBLOCK); //set socket to non-blocking
64
65
  // clear the set ahead of time
66
  FD_ZERO(&original_socket);
67
  FD_ZERO(&original_stdin);
68
  FD_ZERO(&readfds);
69
  FD_ZERO(&writefds);
70
  
71
  // add our descriptors to the set (0 - stands for STDIN)
72
  FD_SET(socket_fd_ob, &original_socket);//instead of 0 put socket_fd_ob
73
  FD_SET(socket_fd_ob, &readfds);
74
  FD_SET(0,&original_stdin);
75
  FD_SET(0, &writefds);
76
77
  // since we got s2 second, it's the "greater", so we use that for
78
  // the n param in select()
79
  numfd  = socket_fd_ob + 1;
80
  numfd2 = socket_fd_hm + 1;
81
  
82
83
  // wait until either socket has data ready to be recv()d (timeout 10.5 secs)
84
  tv.tv_sec = 1;
85
  tv.tv_usec = 500000;
86
87
  server_address_ob.sin_family = AF_INET;
88
  server_address_ob.sin_port = htons(1901);
89
  server_address_ob.sin_addr.s_addr = inet_addr("127.0.0.3");
90
  bzero(&(server_address_ob.sin_zero),sizeof(server_address_ob));
91
92
  server_address_hm.sin_family = AF_INET;
93
  server_address_hm.sin_port = htons(1901);
94
  server_address_hm.sin_addr.s_addr = inet_addr("127.0.0.1");
95
  bzero(&(server_address_ob.sin_zero),sizeof(server_address_hm));
96
97
  // Bind socket to the particular addresses
98
99
  if (bind(socket_fd_ob,(struct sockaddr *)&server_address_ob, sizeof(struct sockaddr)) == -1)
100
  {
101
      error("bind()");
102
  }
103
104
  if (bind(socket_fd_hm,(struct sockaddr *)&server_address_hm, sizeof(struct sockaddr)) == -1)
105
  {
106
      error("bind()");
107
  }
108
109
  address_length  = sizeof(struct sockaddr);
110
  address_length2 = sizeof(struct sockaddr);
111
112
  printf("\nMain server waiting for client to respond...\n");
113
  fflush(stdout);
114
  
115
  while (1)
116
  {
117
    readfds = original_socket;
118
    writefds = original_stdin;//problem
119
    int recieve = select(numfd, &readfds, &writefds,/*NULL,*/ NULL, &tv);
120
    int sent    = select(numfd2, &readfds, &writefds,/*NULL,*/ NULL, &tv);
121
122
    if (recieve == -1 || sent == -1) 
123
    {
124
      perror("select"); // error occurred in select()
125
    } 
126
    else if (recieve == 0 || sent == 0) 
127
    {
128
      printf("Timeout occurred!  No data after 1.5 seconds.\n");
129
    } 
130
    else 
131
    {
132
        // one or both of the descriptors have data
133
        if (FD_ISSET(socket_fd_ob, &readfds)) //if set to read
134
        { 
135
          FD_CLR(socket_fd_ob, &readfds);
136
          bytes_read = recvfrom(socket_fd_ob,recieve_data,MAX_LENGTH,0,(struct sockaddr *)&server_address_hm, &address_length); 
137
      
138
   for (z = 0; z < bytes_read; ++z) {
139
   FD_ISSET(socket_fd_hm, &writefds);
140
          FD_CLR(socket_fd_hm, &writefds);
141
          //recvfrom speech recognition client and decide what to send to HM accordingly..
142
          send_data[bytes_read] = recieve_data[bytes_read];
143
          //block call, will wait till client enters something, before proceeding
144
          //send the corresponding to HM
145
          bytes_sent = sendto(socket_fd_hm,send_data,strlen(send_data)+1,0,(struct sockaddr *)&server_address_hm, &address_length2); 
146
          fflush(stdout);
147
      }                  
148
          recieve_data[bytes_read] = '\0'; //add null to the end of the buffer
149
          send_data[bytes_read] = '\0'; //add null to the end of the buffer
150
          
151
          printf("\n(%s , %d) rcvd: %02x\n",inet_ntoa(server_address_hm.sin_addr),ntohs(server_address_hm.sin_port),recieve_data);
152
          printf("\n(%s , %d) sent: %02x\n",inet_ntoa(server_address_hm.sin_addr),ntohs(server_address_hm.sin_port),send_data);
153
        }
154
155
156
157
158
    } //end else
159
  }//end while
160
161
  close (socket_fd_ob);
162
  return 0;
163
}


Ich kann es mit dem WIRESHARK prüfen dass es die Nachrichten von 
127.0.0.2 immer kreigst, aber er könnte nicht zu 127.0.0.1 weitere 
schicken. Könnten sie bitte vorschlagen wie ich es lösen könnte.

Danke schön.

: Bearbeitet durch User
von jonas biensack (Gast)


Lesenswert?

127.0.0.1 is the local host adress. You need to use another ip.

kind regards jonas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.