2017-05-20 201 views
0

我想創建一個服務器套接字,總是打印屏幕「打勾」,並且如果一個客戶端發送數據到此服務器,服務器將打印該數據。我使用非阻塞套接字,但它不起作用,服務器打印屏幕「打勾」,但無法從客戶端接收數據。非阻塞服務器套接字(linux)

服務器

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); 
    } 
} 

}

客戶

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); 

}

回答

0

要設置上市插座是不可阻擋的,而不是接受套接字。

按照你的代碼的邏輯,你想等到在接受電話,但不是recv調用的

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

把它刪了,而是fcntl調用添加到您的插座從接受電話回來,如

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