0
我有一個tcp服務器和2個客戶端想連接到它。這種客戶端將連接的方式是,其中1個,讓我們打電話client1
將連接發送數據和其他,client2
,將最終連接,發送少量的數據和斷開連接。我設置了O_NONBLOCK
選項。我所經歷的行爲是,在服務器端持續發送數據的客戶端收到一條消息並等待下一個連接...這是我到目前爲止所嘗試的(代碼是在任何時刻client2
想要的時刻連接和發送數據,並斷開):tcp非阻塞不起作用
fcntl(sockfd, F_SETFL, O_NONBLOCK);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd, 5);
clilen = sizeof(cli_addr);
int flag = 0;
do {
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if(newsockfd > 0){
//Sockets Layer Call: inet_ntop()
inet_ntop(AF_INET6, &(cli_addr.sin6_addr),client_addr_ipv6, 100);
printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6);
n = recv(newsockfd, buffer, 49,0);
if(n > 0){
send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer);
memset(buffer,0,sizeof(buffer));
}
}
newsockfd2 = accept(sockfd, (struct sockaddr *) &cli_addr2, &clilen);
//Sockets Layer Call: inet_ntop()
if(newsockfd2 > 0){
inet_ntop(AF_INET6, &(cli_addr2.sin6_addr),client_addr_ipv6, 100);
printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6);
n2= recv(newsockfd2, buffer, 49, 0);
if(n2 > 0){
send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer);
memset(buffer,0,sizeof(buffer));
}
}
}while(!flag);
我也試圖加入,而裏面的選項,並在newsockfd
和newsockfd2
,但同樣的結果設置非阻塞。
我在做什麼錯?謝謝 ! :D
你顯示的代碼會發生什麼?您是否嘗試過使用調試器單步執行代碼?沒有一個系統函數返回錯誤?你爲什麼要做同樣的事情兩次? –
打開兩個插座,而不是在兩者之間跳躍。與非阻塞通信,你應該使用epoll(或選擇,或任何類型的東西)。否則,沒有人會等任何東西,那就是非阻塞的全部目的。 – Slava
@Slava,所以你告訴我1個套接字不能同時處理2個連接? – Lomazo