Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » UDP Socket: Message too long ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.11.2008, 00:12 Uhr
~hsoi
Gast


hi,

hab hier ein Programm mit dem ich UDP-Pakete erzeugen kann,wenn ich jetzt aber eine zu große Nachricht auf den Weg schicke schlägt das senden fehl(Message too long). Kann ich irgendwie dem socket sagen er soll alleine fragmentieren oder muss ich das im vorfeld erledigen und dann sendto mit passenden packetgrößen aufrufen?

Hier mal mein code:


C++:
          #include <stdio.h>
          #include <sys/socket.h>
          #include <arpa/inet.h>
          #include <stdlib.h>
          #include <string.h>
          #include <unistd.h>
          #include <netinet/in.h>

          #define BUFFSIZE 25000
          void Die(char *mess) { perror(mess); exit(1); }

          int main(int argc, char *argv[]) {
            int sock;
            struct sockaddr_in dest;
            char buffer[BUFFSIZE];
            unsigned int echolen;

            if (argc != 4) {
              fprintf(stderr, "USAGE: %s <server_ip> <word> <port>\n", argv[0]);
              exit(1);
            }

            /* Create the UDP socket */
            if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
              Die("Failed to create socket");
            }
            /* Construct the server sockaddr_in structure */
            memset(&dest, 0, sizeof(dest));       /* Clear struct */
            dest.sin_family = AF_INET;                  /* Internet/IP */
            dest.sin_addr.s_addr = inet_addr(argv[1]);  /* IP address */
           // dest.sin_addr.s_addr = inet_addr("192.168.2.102");  ||MLC||
            dest.sin_port = htons(atoi(argv[3]));       /* IP address */

            memset(&buffer, 0, sizeof(buffer));
            sprintf(buffer, argv[2]);
            
            /* server port */
            //echolen = strlen(argv[2]);
            if (sendto(sock, buffer, BUFFSIZE, 0,
                       (struct sockaddr *) &dest,
                       sizeof(dest)) != echolen) {
              Die("Mismatch in number of sent bytes");
            }

            close(sock);
            exit(0);
          }


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.12.2008, 18:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


kommt drauf an was du machst: im endeffekt solltest du dir jedoch ein verfahren überlegen (genauergesagt ein Protokoll) welches deinen Anwendungen auch fehlerkontrolle erlaubt, also das die andere Anwendung weiß wieviel du gesendet hast usw, die Fragmentierung musst du bei UDP jedoch selbst erledigen.

Achja: du musst aufpassen: wenn du udp über localhost (also an einem PC direkt testest) kanns dir passieren das er die z.b 16megabyte große nachrichten erlaubt, übers netzwerk dann aber z.b nicht, je nachdem wie das netzwerksubsystem auf dem jeweiligen betriebsystem eingestellt ist.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: