• 21 odgovora
  • 7.568 pregleda
Datagram Unix socket problem 25.07.2006. u 13:49 · pre 246 meseci #1
Server prihvata string od klijenta i šalje isti taj string kao odgovor sa

Code:

bytes_no = recvfrom(sock_fd, buf, 100, 0, (struct sockaddr*)&client_addr, &addr_len    );
buf[bytes_no] = '\0';
printf("\nReceived '%s' with %d bytes.", buf, bytes_no);
bytes_no = sendto(sock_fd, buf, strlen(buf) + 1, 0, (struct sockaddr*)&client_addr, sizeof(struct sockaddr));
printf("\n%d sent", bytes_no);


dok klijent šalje string i prima odgovor sa

Code:

printf("\nRequest:  ");
scanf("%s", message);
sendto(sock_fd, message, strlen(message) + 1, 0, (struct sockaddr*)&sock_addr, sizeof(struct sockaddr));
memset(message, 0, 100);
bytes_no = recvfrom(sock_fd, message, 100, 0, (struct sockaddr*)&sock_addr, &addr_len);
printf("Received '%s' with %d bytes.", message, bytes_no);


Problem nastaje kada server sa sendto() odgovara klijentu. Ako je socket kreiran kao Internet socket, onda sve lepo radi: server pošalje odgovor, klijent ga dobija i ispisuje. Medjutim, ako je socket kreiran kao Unix socket, server ne uspeva da pošalje sa sendto() već vraća status -1. Zašto? (Kod za oba slučaja je isti osim u delu gde se kreiraju različiti tipovi socketa.)
Pozdrav!
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 27.07.2006. u 15:09 · pre 246 meseci #2
prvo reci kako kreiras sock_fd u oba slucaja. a ako vec znas gde ti je greska, koristi GetLastError() i proveri povratnu vrednost,sigurno ce ti reci nesto...
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 28.07.2006. u 08:20 · pre 246 meseci #3
Code:

printf("\n%d, %s", errno, strerror(err));


mi vracca 22, Unknown error 1073831896, shto mi bash i ne znachi mnogo.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 29.07.2006. u 03:04 · pre 246 meseci #4
vidim,ali nisi napisao kako kreiras socket u oba slucaj (kada radi i kada ne radi)...prikaci ceo kod da ljudi mogu tacno da pogledaju...ko zna sta moz bit...
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 31.07.2006. u 11:44 · pre 246 meseci #5
Na strani klijenta:
Code:

int sock_fd;
struct sockaddr_un sock_addr;
        
sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
sock_addr.sun_family = AF_LOCAL;
strcpy(sock_addr.sun_path, "my.sck");


Na strani servera:
Code:

int sock_fd;
struct sockaddr_un server_addr;
struct sockaddr_un client_addr;
    
sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, "my.sck");
bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));


Isti ovaj kod je i za Internet sockets i radi bez problema (dodushe testirao samo na localhost).
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 31.07.2006. u 15:02 · pre 246 meseci #7
I meni lepo rade SOCK_STREAM (oba, Internet i Unix), ali problem mi prave Unix datagrams, Internet rade bez problema. Ne vidim gde greshim.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 31.07.2006. u 15:08 · pre 246 meseci #8
eto probo sam sa putty da se nakacim na remote linux i oni programi rade. jedino je decko zaboravio da ukljuci <stdlib.h>, dakle evo kodova:

//myheader.h
Code:

#ifndef __MY_HEADER__
#define __MY_HEADER__

#define UNIXSTR_PATH "/tmp/unix.str"

#endif



//server.cpp
Code:

#include "myheader.h" /* for user-defined constants */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <errno.h> /* for the EINTR constant */
#include <sys/wait.h> /* for the waitpid() system call */
#include <sys/un.h> /* for Unix domain sockets */

/* Size of the request queue. */
#define LISTENQ 20

/*
The use of this functions avoids the generation of
"zombie" processes.
*/
void sig_chld( int signo )
{
       pid_t pid;
       int stat;

       while ( ( pid = waitpid( -1, &stat, WNOHANG ) ) > 0 ) {
              printf( "Child %d terminated.\n", pid );
       }
}

int main( int argc, char **argv )
{
       int listenfd, connfd; /* Socket descriptors. */
       char line;
       pid_t childpid;
       socklen_t clilen;
       struct sockaddr_un cliaddr, servaddr; /* Structs for the client and server socket addresses. */

       signal( SIGCHLD, sig_chld ); /* Avoid "zombie" process generation. */

       listenfd = socket( AF_LOCAL, SOCK_STREAM, 0 ); /* Create the server's endpoint */

/* ATTENTION!!! THIS ACTUALLY REMOVES A FILE FROM YOUR HARD DRIVE!!! */
       unlink( UNIXSTR_PATH ); /* Remove any previous socket with the same filename. */

       bzero( &servaddr, sizeof( servaddr ) ); /* Zero all fields of servaddr. */
       servaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( servaddr.sun_path, UNIXSTR_PATH ); /* Define the name of this socket. */

/* Create the file for the socket and register it as a socket. */
       bind( listenfd, ( struct sockaddr* ) &servaddr, sizeof( servaddr ) );

       listen( listenfd, LISTENQ ); /* Create request queue. */

       for ( ; ; ) {
              clilen = sizeof( cliaddr );

/* Copy next request from the queue to connfd and remove it from the queue. */
              connfd = accept( listenfd, ( struct sockaddr * ) &cliaddr, &clilen );

              if ( connfd < 0 ) {
                     if ( errno == EINTR ) /* Something interrupted us. */
                            continue; /* Back to for()... */
                     else {
                            fprintf( stderr, "Accept Error\n" );
                            exit( 0 );
                     }
              }

              childpid = fork(); /* Spawn a child. */

              if ( childpid == 0 ) { /* Child process. */
                     close( listenfd ); /* Close listening socket. */
                     while ( read( connfd, &line, sizeof( char ) ) > 0 )
                            putchar( line );
                            putchar( '\n' );
                            exit( 0 ); /* Terminate child process. */
                     }

              close(connfd); /* Parent closes connected socket */
       }
}



//client.cpp
Code:

#include "myheader.h" /* for user-defined constants */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h> /* basic socket definitions */
#include <sys/types.h> /* basic system data types */
#include <sys/un.h> /* for Unix domain sockets */

int main( int argc, char **argv )
{
       int sockfd;
       struct sockaddr_un servaddr; /* Struct for the server socket address. */
       int pid;
       char send;

       printf( "Write freely. Terminate with Ctrl-D or Ctrl-C.\n" );

       sockfd = socket( AF_LOCAL, SOCK_STREAM, 0 ); /* Create the client's endpoint. */

       bzero( &servaddr, sizeof( servaddr ) ); /* Zero all fields of servaddr. */
       servaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( servaddr.sun_path, UNIXSTR_PATH ); /* Define the name of this socket. */

/* Connect the client's and the server's endpoint. */
       connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

       while( !feof( stdin ) ) {
              send = getchar();
              write( sockfd, &send , sizeof( char ) );
       }

       close( sockfd );
}



prevodis sa klasikom:
Code:

g++ -o server server.cpp
g++ -o client client.cpp


i pokreces sa
Code:

./server
./client


i onda kucaj koliko te volja...
i hope this helps...

cheers
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 31.07.2006. u 15:19 · pre 246 meseci #9
Ovo su stream sockets, i meni rade bez problema u lokalu, problem su mi datagram sockets. Videccu mozze li strace da pomogne, hvala na pokushaju.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 31.07.2006. u 15:35 · pre 246 meseci #10
dali mozda koristis isti kod samo sa SOCK_DGRAM a sve ostalo ti je isto?ako je to slucaj:to je greska:udp ne podrzava accept ni listen:udp server je malo drugaciji.potrazi na netu beej network guid.to ti je zakon.

[Ovu poruku je menjao nikoladsp dana 31.07.2006. u 16:51 GMT+1]
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 31.07.2006. u 15:44 · pre 246 meseci #11
Nije isti. Evo da prikachim kod (koji ne shljaka) za server

Code:

// Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>


int main()
{
    int sock_fd;
    struct sockaddr_un server_addr;
    struct sockaddr_un client_addr;
    socklen_t addr_len;
    char buf[100];
    int bytes_no;
    int err;
    
    sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    server_addr.sun_family = AF_LOCAL;
    strcpy(server_addr.sun_path, "my.sck");
    bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
    
    bytes_no = recvfrom(sock_fd, buf, 100, 0, (struct sockaddr*)&client_addr, &addr_len);
    buf[bytes_no] = '\0';
    printf("\nReceived '%s' with %d bytes.", buf, bytes_no);
    bytes_no = sendto(sock_fd, buf, strlen(buf) + 1, 0, (struct sockaddr*)&client_addr,
        sizeof(struct sockaddr));
    printf("\n%d sent", bytes_no);
    if (bytes_no == -1)
        printf("\n%d, %s", errno, strerror(err));
    
    close(sock_fd);
    unlink(server_addr.sun_path);
    printf("\n");
    
    return 0;
}

i za klijent
Code:

// Client

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>


int main(int argc, char* const argv[])
{
    int sock_fd;
    struct sockaddr_un sock_addr;
    char message[100];
    socklen_t addr_len;
    int bytes_no;
        
    sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    sock_addr.sun_family = AF_LOCAL;
    strcpy(sock_addr.sun_path, "my.sck");
        
    printf("\nRequest:  ");
    scanf("%s", message);
    sendto(sock_fd, message, strlen(message) + 1, 0, (struct sockaddr*)&sock_addr,
        sizeof(struct sockaddr));
    memset(message, 0, 100);
    bytes_no = recvfrom(sock_fd, message, 100, 0, (struct sockaddr*)&sock_addr, &addr_len);
    printf("Received '%s' with %d bytes.", message, bytes_no);
    
    close(sock_fd);
    printf("\n");
    return 0;
}




[Ovu poruku je menjao karas dana 31.07.2006. u 16:55 GMT+1]
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 31.07.2006. u 17:06 · pre 246 meseci #12
u server delu koda promeni:

bytes_no = sendto(sock_fd, buf, strlen(buf) + 1, 0, (struct sockaddr*)&client_addr,
sizeof(struct sockaddr));

u

bytes_no = sendto(sock_fd, buf, strlen(buf) + 1, 0, (struct sockaddr*)&server_addr,
sizeof(struct sockaddr));
Re: Datagram Unix socket problem 01.08.2006. u 05:31 · pre 246 meseci #13
evo ovi unix-socket server i klijent ce da rade kao datagram:

Code:

//server
#include "myheader.h" /* for user-defined constants */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <errno.h> /* for the EINTR constant */
#include <sys/wait.h> /* for the waitpid() system call */
#include <sys/un.h> /* for Unix domain sockets */

/*
The use of this functions avoids the generation of
"zombie" processes.
*/
void sig_chld( int signo )
{
       pid_t pid;
       int stat;

       while ( ( pid = waitpid( -1, &stat, WNOHANG ) ) > 0 ) {
              printf( "Child %d terminated.\n", pid );
       }
}

int main( int argc, char **argv )
{
       int listenfd, connfd; /* Socket descriptors. */
       char line;
       pid_t childpid;
       socklen_t clilen;
       struct sockaddr_un cliaddr, servaddr; /* Structs for the client and server socket addresses. */

       signal( SIGCHLD, sig_chld ); /* Avoid "zombie" process generation. */

       listenfd = socket( AF_LOCAL, SOCK_DGRAM, 0 ); /* Create the server's endpoint */

/* ATTENTION!!! THIS ACTUALLY REMOVES A FILE FROM YOUR HARD DRIVE!!! */
       unlink( UNIXSTR_PATH ); /* Remove any previous socket with the same filename. */

       bzero( &servaddr, sizeof( servaddr ) ); /* Zero all fields of servaddr. */
       servaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( servaddr.sun_path, UNIXSTR_PATH ); /* Define the name of this socket. */

/* Create the file for the socket and register it as a socket. */
       bind( listenfd, ( struct sockaddr* ) &servaddr, sizeof( servaddr ) );
       char buf[100];
    
       for ( ; ; ) {
              clilen = sizeof( cliaddr );

              int bytes_no = recvfrom(listenfd, buf, 100, 0, (struct sockaddr*)&cliaddr, &clilen);
              buf[bytes_no] = '\0';

             printf("packet is %d bytes long\n",bytes_no);
             printf("packet contains \"%s\"\n",buf);
       }
}



Code:

//client
#include "myheader.h" /* for user-defined constants */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h> /* basic socket definitions */
#include <sys/types.h> /* basic system data types */
#include <sys/un.h> /* for Unix domain sockets */
#include <iostream>

using namespace std;

int main( int argc, char **argv )
{
       int sockfd;
       struct sockaddr_un servaddr; /* Struct for the server socket address. */
       int pid;
       char send;

       printf( "Write freely. Terminate with q.\n" );

       sockfd = socket( AF_LOCAL, SOCK_DGRAM, 0 ); /* Create the client's endpoint. */

       bzero( &servaddr, sizeof( servaddr ) ); /* Zero all fields of servaddr. */
       servaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( servaddr.sun_path, UNIXSTR_PATH ); /* Define the name of this socket. */

    int sent=0;
       std::string strSend;

       while (true) {

         cin >> strSend;
         if (strSend == "q") break;

      if ((sent = sendto(sockfd, strSend.c_str(), strSend.size(), 0,
             (struct sockaddr *)&servaddr, sizeof(struct sockaddr))) == -1) {
        perror("sendto");
        exit(1);
    }


      }

       close( sockfd );
}



malo sam izmenio one od tcp socketa.juce smo bili malo u asinhronizmu-bas se potrefilo onda sam se zapio u gradu i evo jutros nisam mogo spavati pa reko da probam nesto da nabudzim jer na poslu mi je komplikovano: putty na remote pa probaj,pa ne radi,edituj,kopiraj sa pscp...smaracina...
pozdrav i nadam se da ce ti ovo pomoci ovaj put
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 01.08.2006. u 09:23 · pre 246 meseci #14
Datagrami su mi radili kada klijent shalje serveru ali problem je nastajao kada server shalje nazad klijentu. Izmenio sam kako mi je slonce rekao, sada server radi (poshalje odgovor) ali klijent ga ne prihvati:

Code:

// Client

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>


int main(int argc, char* const argv[])
{
    int sock_fd;
    struct sockaddr_un sock_addr;
    char message[100];
    socklen_t addr_len;
    int bytes_no;

    sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    sock_addr.sun_family = AF_LOCAL;
    strcpy(sock_addr.sun_path, "my.sck");

    printf("\nRequest:  ");
    scanf("%s", message);
    bytes_no = sendto(sock_fd, message, strlen(message) + 1, 0, (struct sockaddr*)&sock_addr, sizeof(struct sockaddr));
    printf("\nSent %d bytes.", bytes_no);
    memset(message, 0, 100);

// OVDE SE PROGRAM ZAKUCA I NE USPEVA DA PRIHVATI ODGOVOR SERVERA

    bytes_no = recvfrom(sock_fd, message, 100, 0, (struct sockaddr*)&sock_addr, &addr_len);
    printf("Received %d bytes.", bytes_no);

    close(sock_fd);
    printf("\n");
    return 0;
}


Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 01.08.2006. u 10:30 · pre 246 meseci #15
probacu da izmenim one udp primere sto rade da napravim echo server, pa cemo videti. javim se uskoro.
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 01.08.2006. u 10:36 · pre 246 meseci #16
Ok, hvala mnogo.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 01.08.2006. u 11:36 · pre 246 meseci #17
evo ga...

Code:

//server
#include "myheader.h" /* for user-defined constants */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <errno.h> /* for the EINTR constant */
#include <sys/wait.h> /* for the waitpid() system call */
#include <sys/un.h> /* for Unix domain sockets */

/*
The use of this functions avoids the generation of
"zombie" processes.
*/
void sig_chld( int signo )
{
       pid_t pid;
       int stat;

       while ( ( pid = waitpid( -1, &stat, WNOHANG ) ) > 0 ) {
              printf( "Child %d terminated.\n", pid );
       }
}

int main( int argc, char **argv )
{
       int listenfd; /* Socket descriptors. */
       char line;
       pid_t childpid;
       socklen_t clilen;
       struct sockaddr_un cliaddr, servaddr; /* Structs for the client and server socket addresses. */

       signal( SIGCHLD, sig_chld ); /* Avoid "zombie" process generation. */

       listenfd = socket( AF_LOCAL, SOCK_DGRAM, 0 ); /* Create the server's endpoint */

/* ATTENTION!!! THIS ACTUALLY REMOVES A FILE FROM YOUR HARD DRIVE!!! */
       unlink( UNIXSTR_PATH ); /* Remove any previous socket with the same filename. */

       bzero( &servaddr, sizeof( servaddr ) ); /* Zero all fields of servaddr. */
       servaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( servaddr.sun_path, UNIXSTR_PATH ); /* Define the name of this socket. */

/* Create the file for the socket and register it as a socket. */
       bind( listenfd, ( struct sockaddr* ) &servaddr, sizeof( servaddr ) );
       char buf[100];
    
              clilen = sizeof( cliaddr );

              int bytes_no = recvfrom(listenfd, buf, 100, 0, (struct sockaddr*)&cliaddr, &clilen);
              buf[bytes_no] = '\0';

        if (bytes_no >0) {
          
          bzero( &cliaddr, sizeof( cliaddr ) ); /* Zero all fields of servaddr. */
       cliaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( cliaddr.sun_path, "client" ); /* Define the name of this socket. */
          
             printf("rcvd. %s\n",buf);
   
             if ((bytes_no = sendto(listenfd, buf, bytes_no, 0,
                 (struct sockaddr *)&cliaddr, sizeof(struct sockaddr))) == -1) {
            printf ("errno=%d", errno);
            }
            
            memset(buf, 0, sizeof(buf));
        }
}



Code:

//client
#include "myheader.h" /* for user-defined constants */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h> /* basic socket definitions */
#include <sys/types.h> /* basic system data types */
#include <sys/un.h> /* for Unix domain sockets */
#include <iostream>

using namespace std;

int main( int argc, char **argv )
{
       int sockfd;
       struct sockaddr_un servaddr, cliaddr; /* Struct for the server socket address. */
       int pid;
       char send;
    char buf[100];
    
       printf( "Write freely. Terminate with q.\n" );

       sockfd = socket( AF_LOCAL, SOCK_DGRAM, 0 ); /* Create the client's endpoint. */

        unlink( "client" ); /* Remove any previous socket with the same filename. */
       
       bzero( &servaddr, sizeof( servaddr ) ); /* Zero all fields of servaddr. */
       servaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( servaddr.sun_path, UNIXSTR_PATH ); /* Define the name of this socket. */

       int listenfd = socket( AF_LOCAL, SOCK_DGRAM, 0 ); /* Create the server's endpoint */
       bzero( &cliaddr, sizeof( cliaddr ) ); /* Zero all fields of servaddr. */
       cliaddr.sun_family = AF_LOCAL; /* Socket type is local (Unix Domain). */
       strcpy( cliaddr.sun_path, "client" ); /* Define the name of this socket. */

/* Create the file for the socket and register it as a socket. */
       bind( listenfd, ( struct sockaddr* ) &cliaddr, sizeof( cliaddr ) );
       
    int sent=0;
       std::string strSend;

     cin >> strSend;


      if ((sent = sendto(sockfd, strSend.c_str(), strSend.size(), 0,
             (struct sockaddr *)&servaddr, sizeof(struct sockaddr))) == -1) {
        perror("sendto");
        exit(1);
    }
    
    socklen_t clilen = sizeof( servaddr );
        int rcvd = recvfrom(listenfd, buf, 100, 0, (struct sockaddr*)&servaddr, &clilen);
              buf[rcvd] = '\0';

        printf("server responded \"%s\"\n",buf);    


       close( sockfd );
}



znaci problem je sto udp soketi nisu konektovani i NE MOZES da saljes jednostavno samo onome od koga si primio jer te taj NE SLUSA... tako da i na strani klijenta moras imati primati poruke na nekom (drugom, mislim da moze i na istom, ali ne bih to radio ) portu ako zelis da dobijas odgovore sa servera.ovo je jednostavan primer i treba ga doterati,al ja za to nemam vremena

pozdrav
nikola

[Ovu poruku je menjao nikoladsp dana 01.08.2006. u 13:40 GMT+1]
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 01.08.2006. u 12:20 · pre 246 meseci #18
Pretpostavljao sam da je greshka u koncepciji.:) Hvala na objashenju.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: Datagram Unix socket problem 01.08.2006. u 12:33 · pre 246 meseci #19
nema na cemu i drugi put.
Potpis
ja sam panker sa diplomom kod moje mame...
Re: Datagram Unix socket problem 01.08.2006. u 21:39 · pre 246 meseci #20
U gornjim prmerima nemate kontrolu da li je stigla cela poruka kao ni proveru da li je cela poruka poslata. Kod UDP-a nema garancije da ce poruka uopste stici na odrediste i treba biti obazriv prilikom koriscenja UDP-a. Moze se desiti da paketi ne stignu u redosledu kojim su poslati.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme