2017-05-20 161 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);