Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Datagram Unix socket problem

[es] :: C/C++ programiranje :: Datagram Unix socket problem

Strane: 1 2

[ Pregleda: 5012 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Datagram Unix socket problem25.07.2006. u 13:49 - pre 215 meseci
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!
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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem27.07.2006. u 15:09 - pre 215 meseci
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...
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem28.07.2006. u 08:20 - pre 215 meseci
Code:

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


mi vracca 22, Unknown error 1073831896, shto mi bash i ne znachi mnogo.
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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ADSL.neobee.net.



Profil

icon Re: Datagram Unix socket problem29.07.2006. u 03:04 - pre 215 meseci
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...
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem31.07.2006. u 11:44 - pre 215 meseci
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).

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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem31.07.2006. u 12:21 - pre 215 meseci
probacu kuci kad stignem,na poslu nemam linux. mozes pogledati ovo http://netcins.ceid.upatras.gr/OpSys-I/project/server_client.htm ako ti je mrsko da cekas. ti bi trebalo da rade.
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem31.07.2006. u 15:02 - pre 215 meseci
I meni lepo rade SOCK_STREAM (oba, Internet i Unix), ali problem mi prave Unix datagrams, Internet rade bez problema. Ne vidim gde greshim.

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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem31.07.2006. u 15:08 - pre 215 meseci
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

ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem31.07.2006. u 15:19 - pre 215 meseci
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.
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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem31.07.2006. u 15:35 - pre 215 meseci
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]
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem31.07.2006. u 15:44 - pre 215 meseci
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]
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."
 
Odgovor na temu

slonce
Milan Banovic
Zemun

Član broj: 1068
Poruke: 32
80.93.255.*



Profil

icon Re: Datagram Unix socket problem31.07.2006. u 17:06 - pre 215 meseci
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));
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ADSL.neobee.net.



Profil

icon Re: Datagram Unix socket problem01.08.2006. u 05:31 - pre 215 meseci
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
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem01.08.2006. u 09:23 - pre 215 meseci
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;
}



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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem01.08.2006. u 10:30 - pre 215 meseci
probacu da izmenim one udp primere sto rade da napravim echo server, pa cemo videti. javim se uskoro.
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem01.08.2006. u 10:36 - pre 215 meseci
Ok, hvala mnogo.
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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem01.08.2006. u 11:36 - pre 215 meseci
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]
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Datagram Unix socket problem01.08.2006. u 12:20 - pre 215 meseci
Pretpostavljao sam da je greshka u koncepciji.:) Hvala na objashenju.
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."
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Datagram Unix socket problem01.08.2006. u 12:33 - pre 215 meseci
nema na cemu i drugi put.
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.beotel.net.



Profil

icon Re: Datagram Unix socket problem01.08.2006. u 21:39 - pre 215 meseci
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.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Datagram Unix socket problem

Strane: 1 2

[ Pregleda: 5012 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.