См. это . Сервер и клиент 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".
Так есть ли способ заставить его отправлять и получать на одной стороне?
Спасибо!