Почему мой сервер UDS не будет принимать соединения?

Я пишу небольшой сервер UDS для назначения, и чувствую, что мой код в основном есть, но я не получаю абсолютно никаких результатов, когда на самом деле пытаюсь запустить его.

Код проверяется сценарием оболочки, который отправляет несколько различных тестовых вызовов на главную функцию моего кода. Единственное, что передается на главную, – это имя файла log и UDS path , а затем разные клиенты подключаются к серверу, что должно просто привести к определенному журналу вывода, чтобы проверить правильность кода разрыва.

Моя главная функция здесь:

 int main( int argc, char * argv[] ) { if ( argc != 3 ) return usage( argv[0] ); log_fd = fopen(argv[1], "a"); // create a server socket // domain (ie, family) is AF_UNIX // type is SOCK_STREAM int listenfd = socket(AF_UNIX, SOCK_STREAM, 0); socklen_t clientLength = sizeof(struct sockaddr_un); struct sockaddr_un clientAddr; clientAddr.sa_family = AF_UNIX; strcpy(clientAddr.sun_path, argv[2]); pthread_t tid; // unlink the UDS path) unlink(argv[2]); // bind the server socket bind(listenfd, (SA *)&clientAddr, clientLength); // listen listen(listenfd, 1024); // loop to wait for connections; // as each connection is accepted, // launch a new thread that calls // recv_log_msgs(), which receives // messages and writes them to the log file while(1){ printf( "Waiting for a connection on UDS path %s...\n", argv[2] ); int * clientfdp = malloc(sizeof(int)); *clientfdp = accept(listenfd, (SA *) &clientAddr, &clientLength); pthread_create(&tid, NULL, recv_log_msgs, clientfdp); } // when the loop ends, close the listening socket close(listenfd); // close the log file fclose(log_fd); return 0; } в int main( int argc, char * argv[] ) { if ( argc != 3 ) return usage( argv[0] ); log_fd = fopen(argv[1], "a"); // create a server socket // domain (ie, family) is AF_UNIX // type is SOCK_STREAM int listenfd = socket(AF_UNIX, SOCK_STREAM, 0); socklen_t clientLength = sizeof(struct sockaddr_un); struct sockaddr_un clientAddr; clientAddr.sa_family = AF_UNIX; strcpy(clientAddr.sun_path, argv[2]); pthread_t tid; // unlink the UDS path) unlink(argv[2]); // bind the server socket bind(listenfd, (SA *)&clientAddr, clientLength); // listen listen(listenfd, 1024); // loop to wait for connections; // as each connection is accepted, // launch a new thread that calls // recv_log_msgs(), which receives // messages and writes them to the log file while(1){ printf( "Waiting for a connection on UDS path %s...\n", argv[2] ); int * clientfdp = malloc(sizeof(int)); *clientfdp = accept(listenfd, (SA *) &clientAddr, &clientLength); pthread_create(&tid, NULL, recv_log_msgs, clientfdp); } // when the loop ends, close the listening socket close(listenfd); // close the log file fclose(log_fd); return 0; } 

где используется myloggerd .

Эта основная функция прослушивает любые клиентские соединения, и когда она принимается, она создает новый stream в функции подпрограммы streamа, называемой recv_log_msgs . Мой код для этого здесь:

 void * recv_log_msgs( void * arg ) //Thread Routine { // loops to receive messages from a client; // when the connection is closed by the client, // close the socket int clientfd = *((int *)arg); char buffer[1500]; memset(buffer, 0, 1500); int currentPos = 0; int bytesRec; int recvng = 1; while(recvng){ bytesRec = recv(clientfd, buffer, 1500-currentPos, 0); currentPos += bytesRec; if(buffer[currentPos - 1] == '\n') recvng = 0; } fprintf(log_fd, "LOGGER %d %s", clientfd, buffer); close(clientfd); return NULL; } в void * recv_log_msgs( void * arg ) //Thread Routine { // loops to receive messages from a client; // when the connection is closed by the client, // close the socket int clientfd = *((int *)arg); char buffer[1500]; memset(buffer, 0, 1500); int currentPos = 0; int bytesRec; int recvng = 1; while(recvng){ bytesRec = recv(clientfd, buffer, 1500-currentPos, 0); currentPos += bytesRec; if(buffer[currentPos - 1] == '\n') recvng = 0; } fprintf(log_fd, "LOGGER %d %s", clientfd, buffer); close(clientfd); return NULL; } 

Таким образом, каждый раз, когда stream входит в эту функцию, данные записываются в файл журнала. Если файл журнала получается корректным, я получаю 100%. Если нет, то я потерплю неудачу.

На данный момент, когда я тестирую свое решение, ничего не происходит вообще.

Я получаю бесконечный цикл отпечатков, которые говорят « Waiting for connection on the UDS path... , который находится внутри объекта while в конце main. Разве это не должно продолжаться цикл? Я сделал вызов, чтобы accept и создал stream, пока этот stream не вышел?

    Вы несовместимы с типом clientAddr для сокета AF_UNIX : должны быть struct sockaddr

    Это сработало для меня:

     int main( int argc, char * argv[] ) { if ( argc != 3 ) return -1; // log_fd = fopen(argv[1], "a"); // create a server socket // domain (ie, family) is AF_UNIX // type is SOCK_STREAM int listenfd = socket(AF_UNIX, SOCK_STREAM, 0); socklen_t clientLength = sizeof(struct sockaddr_un); struct sockaddr clientAddr; clientAddr.sa_family = AF_UNIX; strcpy(clientAddr.sa_data, argv[2]); pthread_t tid; // unlink the UDS path) unlink(argv[2]); // bind the server socket bind(listenfd, (struct sockaddr*)&clientAddr, clientLength); // listen listen(listenfd, 1024); // loop to wait for connections; // as each connection is accepted, // launch a new thread that calls // recv_log_msgs(), which receives // messages and writes them to the log file while(1){ printf( "Waiting for a connection on UDS path %s...\n", argv[2] ); int * clientfdp = malloc(sizeof(int)); *clientfdp = accept(listenfd, (struct sockaddr *) &clientAddr, &clientLength); pthread_create(&tid, NULL, recv_log_msgs, clientfdp); free(clientfdp); } // when the loop ends, close the listening socket close(listenfd); // close the log file // fclose(log_fd); return 0; } в int main( int argc, char * argv[] ) { if ( argc != 3 ) return -1; // log_fd = fopen(argv[1], "a"); // create a server socket // domain (ie, family) is AF_UNIX // type is SOCK_STREAM int listenfd = socket(AF_UNIX, SOCK_STREAM, 0); socklen_t clientLength = sizeof(struct sockaddr_un); struct sockaddr clientAddr; clientAddr.sa_family = AF_UNIX; strcpy(clientAddr.sa_data, argv[2]); pthread_t tid; // unlink the UDS path) unlink(argv[2]); // bind the server socket bind(listenfd, (struct sockaddr*)&clientAddr, clientLength); // listen listen(listenfd, 1024); // loop to wait for connections; // as each connection is accepted, // launch a new thread that calls // recv_log_msgs(), which receives // messages and writes them to the log file while(1){ printf( "Waiting for a connection on UDS path %s...\n", argv[2] ); int * clientfdp = malloc(sizeof(int)); *clientfdp = accept(listenfd, (struct sockaddr *) &clientAddr, &clientLength); pthread_create(&tid, NULL, recv_log_msgs, clientfdp); free(clientfdp); } // when the loop ends, close the listening socket close(listenfd); // close the log file // fclose(log_fd); return 0; }