Может ли сервер датаграмм сокета домена unix отправлять и получать в одном файле? - PullRequest
0 голосов
/ 11 июля 2020

См. это . Сервер и клиент UDP INET могут отправлять и получать на одной стороне.

Но теперь я хочу использовать сокет домена unix. Вот мой код:

клиент:

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

#define SERVER_PATH "tpf_unix_sock.server"
#define DATA "Hello from client\n"

int main(void)
{
    int client_socket, rc;
    struct sockaddr_un remote, peer_sock; 
    char buf[256];
    memset(&remote, 0, sizeof(struct sockaddr_un));
    
    /****************************************/
    /* Create a UNIX domain datagram socket */
    /****************************************/
    client_socket = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (client_socket == -1) {
        // printf("SOCKET ERROR = %d\n", sock_errno());
        exit(1);
    }

    remote.sun_family = AF_UNIX;        
    strcpy(remote.sun_path, SERVER_PATH); 
    
    strcpy(buf, DATA);
    printf("Sending data...\n");
    rc = sendto(client_socket, buf, strlen(buf), MSG_CONFIRM, (struct sockaddr *) &remote, sizeof(remote));
    if (rc == -1) {
        close(client_socket);
        exit(1);
    }   
    else {
        printf("Data sent!\n");
    }
    int n, len;
    len = sizeof(remote);
    n = recvfrom(client_socket, buf, sizeof(buf),
                 0, (struct sockaddr *)&remote,
                 &len);
    buf[n] = '\0';
    printf("Server : %s\n", buf);
    rc = close(client_socket);

    return 0;
}

сервер:

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

#define SOCK_PATH "tpf_unix_sock.server"

int main(void){

    int server_sock, len, rc;
    int bytes_rec = 0;
    struct sockaddr_un server_sockaddr, peer_sock;
    char buf[256];
    memset(&server_sockaddr, 0, sizeof(struct sockaddr_un));
    memset(buf, 0, 256);
    
    server_sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (server_sock == -1){
        exit(1);
    }
    
    server_sockaddr.sun_family = AF_UNIX;
    strcpy(server_sockaddr.sun_path, SOCK_PATH); 
    len = sizeof(server_sockaddr);
    unlink(SOCK_PATH);
    rc = bind(server_sock, (struct sockaddr *) &server_sockaddr, len);
    if (rc == -1){
        // printf("BIND ERROR = %d", sock_errno());
        close(server_sock);
        exit(1);
    }
    
    printf("waiting to recvfrom...\n");
    bytes_rec = recvfrom(server_sock, buf, 256, MSG_WAITALL, (struct sockaddr *)&peer_sock, &len);
    if (bytes_rec == -1){
        // printf("RECVFROM ERROR = %d", sock_errno());
        close(server_sock);
        exit(1);
    }
    else {
       printf("DATA RECEIVED = %s\n", buf);
    }
    strcpy(buf, "DATA ckt\0");
    printf("Sending data...\n");
    sleep(1);
    rc = sendto(server_sock, buf, strlen(buf), MSG_CONFIRM, (struct sockaddr *)&peer_sock, sizeof(peer_sock));
    printf("Data sent!\n");
    close(server_sock);

    return 0;
}

И печать на стороне сервера:

ожидание возврата от ... ДАННЫЕ ПОЛУЧЕНЫ = Привет от клиента

Отправка данных ... Данные отправлены!

печать на стороне клиента:

Отправка данных ... Данные отправлены!

Затем блокируется функция "recvfrom".

Так есть ли способ заставить его отправлять и получать на одной стороне?

Спасибо!

...