Changeset 4379 for neercs


Ignore:
Timestamp:
Mar 3, 2010, 8:53:10 AM (10 years ago)
Author:
Sam Hocevar
Message:

Networking tests. Doesn't work yet.

Location:
neercs/trunk/src
Files:
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/Makefile.am

    r4370 r4379  
    1010neercs_LDADD = @CACA_LIBS@ @UTIL_LIBS@ @PAM_LIBS@ @PYTHON_LIBS@
    1111
    12 mini_neercs_SOURCES = mini-neercs.c mini-neercs.h mini-client.c mini-server.c
     12mini_neercs_SOURCES = mini-neercs.c mini-neercs.h mini-client.c mini-server.c \
     13                      mini-socket.c
    1314mini_neercs_CFLAGS = @CACA_CFLAGS@ @PYTHON_CFLAGS@ -DMINI_NEERCS
    1415mini_neercs_LDADD = @CACA_LIBS@ @UTIL_LIBS@ @PAM_LIBS@ @PYTHON_LIBS@
  • neercs/trunk/src/mini-client.c

    r4370 r4379  
    1313 */
    1414
     15#if defined HAVE_CONFIG_H
     16#   include "config.h"
     17#endif
     18
    1519#include "mini-neercs.h"
     20#include "mini-socket.h"
    1621
    1722#include <caca.h>
    1823
    19 caca_display_t *dp;
    20 caca_canvas_t *cv;
     24static caca_display_t *dp;
     25static caca_canvas_t *cv;
     26static nrx_socket_t *insock, *outsock;
    2127
    2228void client_init(void)
    2329{
     30    int i, usec = 1000;
     31
    2432    cv = caca_create_canvas(0, 0);
    2533    dp = caca_create_display(cv);
    2634    caca_set_display_title(dp, "Press Esc to quit");
     35
     36    for (i = 0; i < 10; i++)
     37    {
     38        outsock = socket_open("/tmp/neercs.sock", 0);
     39        if (outsock)
     40            break;
     41        usleep(usec);
     42        usec += usec;
     43    }
     44
     45    insock = socket_open("/tmp/neercs.sock.client", 1);
     46
     47    socket_puts(outsock, "CONNECT /tmp/neercs.sock.client");
    2748}
    2849
     
    3051{
    3152    caca_event_t ev;
    32     if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0)
     53    if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 1000)
    3354        && caca_get_event_key_ch(&ev) == CACA_KEY_ESCAPE)
    3455        return 0;
  • neercs/trunk/src/mini-neercs.c

    r4370 r4379  
    1313 */
    1414
     15#if defined HAVE_CONFIG_H
     16#   include "config.h"
     17#endif
     18
    1519#include <stdlib.h>
     20#include <stdio.h> /* perror() */
     21#include <unistd.h> /* fork() */
    1622
    1723#include "mini-neercs.h"
     
    1925int main(void)
    2026{
    21     client_init();
    22     while(client_step()) ;
    23     client_fini();
     27    pid_t pid;
     28
     29    pid = fork();
     30
     31    if (pid < 0)
     32    {
     33        perror("fork");
     34        return EXIT_FAILURE;
     35    }
     36
     37    if (pid > 0)
     38    {
     39        client_init();
     40        while(client_step()) ;
     41        client_fini();
     42    }
     43    else
     44    {
     45        server_init();
     46        while(server_step()) ;
     47        server_fini();
     48    }
    2449
    2550    return EXIT_SUCCESS;
  • neercs/trunk/src/mini-neercs.h

    r4370 r4379  
    1717void client_fini(void);
    1818
     19void server_init(void);
     20int server_step(void);
     21void server_fini(void);
     22
  • neercs/trunk/src/mini-server.c

    r4370 r4379  
    1313 */
    1414
     15#if defined HAVE_CONFIG_H
     16#   include "config.h"
     17#endif
     18
     19#include <stdio.h> /* BUFSIZ */
     20
     21#include "mini-neercs.h"
     22#include "mini-socket.h"
     23
     24static nrx_socket_t *insock, *outsock;
     25
     26void server_init(void)
     27{
     28    insock = socket_open("/tmp/neercs.sock", 1);
     29}
     30
     31int server_step(void)
     32{
     33    int ret = socket_select(insock, 10000);
     34
     35    if (ret > 0)
     36    {
     37        char buf[BUFSIZ];
     38        ssize_t bytes = socket_read(insock, buf, BUFSIZ);
     39        if (bytes > 0)
     40        {
     41            fprintf(stderr, "read: %s\n", buf);
     42            return 0;
     43        }
     44    }
     45//else fprintf(stderr, "no data \n");
     46
     47    return 1;
     48}
     49
     50void server_fini(void)
     51{
     52    socket_close(insock);
     53}
     54
  • neercs/trunk/src/mini-socket.c

    r4371 r4379  
    1313 */
    1414
     15#if defined HAVE_CONFIG_H
     16#   include "config.h"
     17#endif
     18
     19#include <stdio.h> /* perror() */
     20#include <stdlib.h> /* malloc(), free() */
     21#include <unistd.h> /* unlink() */
     22#include <fcntl.h> /* fcntl() */
     23#include <string.h> /* memcpy() */
     24#include <sys/select.h> /* select() */
     25#include <sys/types.h> /* bind(), connect() */
     26#include <sys/socket.h> /* bind(), connect() */
     27#include <sys/un.h> /* AF_UNIX */
     28
    1529#include "mini-neercs.h"
     30#include "mini-socket.h"
    1631
    17 int create_socket(char const *path)
     32#define SIZEOF_SUN_PATH (sizeof(((struct sockaddr_un *)NULL)->sun_path))
     33
     34struct nrx_socket
    1835{
     36#if 1
     37    /* Linux sockets */
     38    int fd;
     39    int server;
     40    char path[SIZEOF_SUN_PATH];
     41#else
     42#   error No socket implementation
     43#endif
     44};
     45
     46nrx_socket_t * socket_open(char const *path, int server)
     47{
     48    nrx_socket_t * sock;
    1949    struct sockaddr_un addr;
    20     int fd;
     50    int ret, fd;
    2151
    2252    fd = socket(AF_UNIX, SOCK_DGRAM, 0);
     
    2454    {
    2555        perror("socket creation");
    26         return -1;
     56        return NULL;
    2757    }
    2858
    2959    memset(&addr, 0, sizeof(struct sockaddr_un));
    3060    addr.sun_family = AF_UNIX;
    31     strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
    32     unlink(path);
     61    strncpy(addr.sun_path, path, SIZEOF_SUN_PATH - 1);
    3362
    34     if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0)
     63    if (server)
    3564    {
    36         perror("socket binding");
     65        unlink(path);
     66        ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
     67    }
     68    else
     69    {
     70        ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
     71    }
     72
     73    if (ret < 0)
     74    {
     75        perror(server ? "socket binding" : "socket connection");
    3776        close(fd);
    38         return -1;
     77        return NULL;
    3978    }
     79
    4080    fcntl(fd, F_SETFL, O_NONBLOCK);
    4181
    42     return fd;
     82    sock = malloc(sizeof(*sock));
     83    sock->fd = fd;
     84    sock->server = server;
     85    strncpy(sock->path, path, SIZEOF_SUN_PATH - 1);
     86
     87    return sock;
    4388}
    4489
    45 int connect_socket(char const *path)
     90int socket_select(nrx_socket_t *sock, int usecs)
    4691{
    47     struct sockaddr_un addr;
    48     int fd;
     92    fd_set rfds;
     93    struct timeval tv;
     94    int ret;
    4995
    50     fd = socket(AF_UNIX, SOCK_DGRAM, 0);
    51     if (fd < 0)
    52     {
    53         perror("socket creation");
     96    FD_ZERO(&rfds);
     97    FD_SET(sock->fd, &rfds);
     98
     99    tv.tv_sec = usecs / 1000000;
     100    tv.tv_usec = usecs % 1000000;
     101
     102    ret = select(1, &rfds, NULL, NULL, &tv);
     103    if (ret < 0)
    54104        return -1;
    55     }
    56105
    57     memset(&addr, 0, sizeof(struct sockaddr_un));
    58     addr.sun_family = AF_UNIX;
    59     strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
     106    if (FD_ISSET(sock->fd, &rfds))
     107        return 1;
    60108
    61     if (connect((struct sockaddr *)&addr, sizeof(addr)) < 0)
    62     {
    63         perror("socket binding");
    64         close(fd);
    65         return -1;
    66     }
    67     fcntl(fd, F_SETFL, O_NONBLOCK);
    68 
    69     return fd;
     109    return 0;
    70110}
    71111
     112int socket_puts(nrx_socket_t *sock, char const *str)
     113{
     114    return write(sock->fd, str, strlen(str));
     115}
     116
     117ssize_t socket_read(nrx_socket_t *sock, void *buf, size_t count)
     118{
     119    return read(sock->fd, buf, count);
     120}
     121
     122void socket_close(nrx_socket_t *sock)
     123{
     124    close(sock->fd);
     125    if (sock->server)
     126        unlink(sock->path);
     127    free(sock);
     128}
     129
  • neercs/trunk/src/mini-socket.h

    r4371 r4379  
    1313 */
    1414
    15 #include <stdlib.h>
     15#include <sys/types.h>
    1616
    17 #include "mini-neercs.h"
     17typedef struct nrx_socket nrx_socket_t;
    1818
    19 int main(void)
    20 {
    21     client_init();
    22     while(client_step()) ;
    23     client_fini();
     19nrx_socket_t * socket_open(char const *path, int server);
     20int socket_select(nrx_socket_t *sock, int usecs);
     21int socket_puts(nrx_socket_t *sock, char const *str);
     22ssize_t socket_read(nrx_socket_t *sock, void *buf, size_t count);
     23void socket_close(nrx_socket_t *socket);
    2424
    25     return EXIT_SUCCESS;
    26 }
    27 
Note: See TracChangeset for help on using the changeset viewer.