2017-05-20 1 views
0

Ich möchte einen Server-Socket erstellen, der immer zum Bildschirm "Tick" druckt, und wenn ein Client Daten an diesen Server sendet, wird der Server diese Daten drucken. Ich benutze non-blocking Socket, aber das es nicht funktioniert, Server druckt, um "Tick" zu screenen, kann aber keine Daten vom Client empfangen.non-blocking server socket (linux)

Server

int main(int argc, char *argv[]) { 
int server_sockfd, client_sockfd; 
sockaddr_un server_address; 
sockaddr_un client_address; 
int client_len; 
int res; 

/* remove old socket and create unnamed socket */ 
unlink("server_socket"); 
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); 

/* non-blocking socket */ 
fcntl(server_sockfd, F_SETFL, O_NONBLOCK); 

/* name the socket */ 
server_address.sun_family = AF_UNIX; 
strcpy(server_address.sun_path, "server_socket"); 
bind(server_sockfd, (sockaddr*)&server_address, sizeof(server_address)); 

/* listen client */ 
printf("server_waiting\n"); 
listen(server_sockfd, 5); 
client_len = sizeof(client_address); 
client_sockfd = accept(server_sockfd, (sockaddr*)&client_address, (socklen_t*)&client_len); 

while(1) { 
    char ch; 
    res = recv(client_sockfd, &ch, 1, 0); 
    if (res == -1) { 
     printf("tick\n"); 
    } 
    else { 
     printf("received: %c\n", ch); 
    } 
} 

}

Client

int main(int argc, char *argv[]) { 
int sock_fd; 
struct sockaddr_un address; 
int result; 
char ch = 'A'; 

/* create socket for client */ 
sock_fd = socket(AF_UNIX, SOCK_STREAM, 0); 

/* name of socket as agreed with server */ 
address.sun_family = AF_UNIX; 
strcpy(address.sun_path, "server_socket"); 

result = connect(sock_fd, (sockaddr*) &address, sizeof(address)); 
if (result == -1) { 
     perror("fail\n"); 
     exit(1); 
} 

/* write via socket */ 
send(sock_fd, &ch, 1, 0); 
close(sock_fd); 
exit(0); 

}

Antwort

0

Sie die Auflistung Buchse Einstellung statt der angenommenen Fassung als nicht blockiert.

Code Logik folgend, müssen Sie auf den Anruf annehmen warten wollen, aber die recv Ruf es nicht

Statt

/* non-blocking socket */ 
fcntl(server_sockfd, F_SETFL, O_NONBLOCK); 

löschen und stattdessen die fcntl Aufruf an die Buchse hinzufügen Sie sind zurück von der Annahme Anruf, wie

client_sockfd = accept(....); 
fcntl(client_sockfd, F_SETFL, O_NONBLOCK);