Fehler gegen sendto() zu andere server, den mit UDP socket verbindet ist

OP #3903122
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.