The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Файловые сокеты, !*! Mariupolets, 24-Фев-08, 03:46  [смотреть все]
Доброго времени!

Столкнулся со странной проблемой. Создаю файловый сокет без путей (т.е. в текущей папке программы) - всё отлично работает. Создаю оный в папке /tmp клиент его не видит и всё тут. Вот код:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>

#define SOCK_NAME "/tmp/socket.soc" // <<<<< меняю на "socket.soc" - работает
#define BUF_SIZE 256

int main(int argc, char ** argv)
{
    struct sockaddr srvr_name, rcvr_name;
    char buf[BUF_SIZE];
    int   sock;
    int   namelen, bytes;
    
    sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (sock < 0){
    perror("socket failed");
    return EXIT_FAILURE;
    }
    srvr_name.sa_family = AF_UNIX;
    strcpy(srvr_name.sa_data, SOCK_NAME);
    namelen = strlen(srvr_name.sa_data) + sizeof(srvr_name.sa_family) + 1;
    printf("Socket %s, namesize %i\n", srvr_name.sa_data, namelen);
    unlink(SOCK_NAME);
    if(fork()==0){
        if (bind(sock, &srvr_name, namelen) < 0){
        perror("bind failed");
        return EXIT_FAILURE;
    }
    

        bytes = recvfrom(sock, buf, sizeof(buf),  0, &rcvr_name, &namelen);
        if (bytes < 0) {
        perror("recvfrom failed");
            return EXIT_FAILURE;
    }

    buf[bytes] = 0;
    rcvr_name.sa_data[namelen] = 0;
    fprintf(stdout, "Client sent: %s\n", buf);
    unlink(SOCK_NAME)<0;
    close(sock);
    }
    else{
    
    char *mes = "Hello";
    if(sendto(sock, mes, strlen(mes), 0, &srvr_name, namelen)<0)perror("Can't send");
    }
    
}

Естественно, клиент в другой программе, это я для компактности (и проверки) слил в одну (но в разные процессы). Клиент, по сути, выглядит также, только без bind. Ошибку выдаёт sendto, говорит, нету такого файла.

Ещё одно странное замечание. Если клиент и сервер в одном процессе, то работают нормально (т.е. если написать sendto прямо перед recvfrom).  Т.о. как я понимаю, в папке /tmp не находит сокет-файл лишь другой процесс. Если клиент в другой программе, но в тойже папке, то всё работает.

Конечно, и вариант с размещением сокета в той же папке, что и программа, подходит, но как-то корректнее использовать /tmp.

Буду очень признателен за помощь.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру