ti7bo7 | Bonjour,
J'aimerai communiquer entre deux processus sous linux. J'ai un programme en C (serveur) et un autre en PHP (client). Le programme en C démarre bien et j'ai bien mon fichier server dans le dossier tmp.
Par contre, le fichier php je suis un peu perdu avec le client. Je ne sais pas comment faire. J'ai vu qu'il y avait aussi des client.sock ou serveur.sock qui pouvait se créer mais pourquoi mon fichier C ne me génère pas cela ?? Donc là je nage un peu après plusieurs heures de recherches.. je viens à l'aide ! Merci
Code :
- <?php
- $socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
- socket_connect($socket, "unix://tmp/server" );
- $msg = "\nThis is a test\r\n";
- socket_write($socket, $msg, strlen($msg));
- socket_close($socket);
- ?>
|
Code :
- /**************************************************************************/
- /* This sample program provides code for aserver application that uses */
- /* AF_UNIX address family */
- /**************************************************************************/
- /**************************************************************************/
- /* Header files needed for this sample program */
- /**************************************************************************/
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- /**************************************************************************/
- /* Constants used by this program */
- /**************************************************************************/
- #define SERVER_PATH "/tmp/server"
- #define BUFFER_LENGTH 250
- #define FALSE 0
- void main()
- {
- /***********************************************************************/
- /* Variable and structure definitions. */
- /***********************************************************************/
- int sd=-1, sd2=-1;
- int rc, length;
- char buffer[BUFFER_LENGTH];
- struct sockaddr_un serveraddr;
- /***********************************************************************/
- /* A do/while(FALSE) loop is used to make error cleanup easier. The */
- /* close() of each of the socket descriptors is only done once at the */
- /* very end of the program. */
- /***********************************************************************/
- do
- {
- /********************************************************************/
- /* The socket() function returns a socket descriptor representing */
- /* an endpoint. The statement also identifies that the UNIX */
- /* address family with the stream transport (SOCK_STREAM) will be */
- /* used for this socket. */
- /********************************************************************/
- sd = socket(AF_UNIX, SOCK_STREAM, 0);
- if (sd < 0)
- {
- perror("socket() failed" );
- break;
- }
- /********************************************************************/
- /* After the socket descriptor is created, a bind() function gets a */
- /* unique name for the socket. */
- /********************************************************************/
- memset(&serveraddr, 0, sizeof(serveraddr));
- serveraddr.sun_family = AF_UNIX;
- strcpy(serveraddr.sun_path, SERVER_PATH);
- rc = bind(sd, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
- if (rc < 0)
- {
- perror("bind() failed" );
- break;
- }
- /********************************************************************/
- /* The listen() function allows the server to accept incoming */
- /* client connections. In this example, the backlog is set to 10. */
- /* This means that the system will queue 10 incoming connection */
- /* requests before the system starts rejecting the incoming */
- /* requests. */
- /********************************************************************/
- rc = listen(sd, 10);
- if (rc< 0)
- {
- perror("listen() failed" );
- break;
- }
- printf("Ready for client connect().\n" );
- /********************************************************************/
- /* The server uses the accept() function to accept an incoming */
- /* connection request. The accept() call will block indefinitely */
- /* waiting for the incoming connection to arrive. */
- /********************************************************************/
- sd2 = accept(sd, NULL, NULL);
- if (sd2 < 0)
- {
- perror("accept() failed" );
- break;
- }
- /********************************************************************/
- /* In this example we know that the client will send 250 bytes of */
- /* data over. Knowing this, we can use the SO_RCVLOWAT socket */
- /* option and specify that we don't want our recv() to wake up */
- /* until all 250 bytes of data have arrived. */
- /********************************************************************/
- length = BUFFER_LENGTH;
- rc = setsockopt(sd2, SOL_SOCKET, SO_RCVLOWAT,
- (char *)&length, sizeof(length));
- if (rc < 0)
- {
- }
- printf("%d bytes of data were received\n", rc);
- if (rc == 0 ||
- rc < sizeof(buffer))
- {
- printf("The client closed the connection before all of the\n" );
- printf("data was sent\n" );
- break;
- }
- /********************************************************************/
- /* Echo the data back to the client */
- /********************************************************************/
- rc = send(sd2, buffer, sizeof(buffer), 0);
- if (rc < 0)
- {
- perror("send() failed" );
- break;
- }
- /********************************************************************/
- /* Program complete */
- /********************************************************************/
- } while (FALSE);
- /***********************************************************************/
- /* Close down any open socket descriptors */
- /***********************************************************************/
- if (sd != -1)
- close(sd);
- if (sd2 != -1)
- close(sd2);
- /***********************************************************************/
- /* Remove the UNIX path name from the file system */
- /***********************************************************************/
- unlink(SERVER_PATH);
- }
|
Message édité par ti7bo7 le 03-10-2012 à 22:50:01
|