Bất kỳ ý tưởng nào khi máy chủ ghi một ổ cắm trong khi máy khách đang chờ chọn, chọn không bao giờ kết thúc?bằng cách chọn để đợi dữ liệu trên ổ cắm ứng dụng khách
Tôi đang sử dụng c để giao tiếp giữa các ổ cắm. Khách hàng của tôi kết nối với máy chủ của tôi tốt.
socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor
client->address.sin_addr.s_addr = inet_addr(ipAddress);
client->address.sin_family = AF_INET;
client->address.sin_port = htons(port);
bind(socket_desc,&address,sizeof(address));
connect(socket_desc, &address, sizeof(address));
Khi tôi sử dụng recv để chặn và lắng nghe cho dữ liệu, tất cả mọi thứ hoạt động tốt:
int bytesRead = 1;
while(bytesRead){
int bufsize=1024;
char *buffer=malloc(bufsize);
bytesRead = recv(socket_desc, buffer, bufsize, 0);
printf("CLIENT RECV: %s", buffer);
}
Nếu tôi cố gắng sử dụng lựa chọn, nó dường như không đọc bất kỳ dữ liệu. Nếu tôi thêm STDIN vào fd_set, tôi có thể buộc nó đọc từ socket, nhưng chọn dường như không được kích hoạt từ việc đọc socket_desc trong dữ liệu ...?
int running = 1;
while(running){
/* wait for something to happen on the socket */
struct timeval selTimeout;
selTimeout.tv_sec = 2; /* timeout (secs.) */
selTimeout.tv_usec = 0; /* 0 microseconds */
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading
FD_SET(socket_desc, &readSet);//tcp socket
int numReady = select(3, &readSet, NULL, NULL, &selTimeout);
//IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD
if(numReady > 0){
char buffer[100] = {'\0'};
int bytesRead = read(socket_desc, &buffer, sizeof(buffer));
printf("bytesRead %i : %s", bytesRead, buffer);
if(bytesRead == 0){
running = FALSE;
printf("Shutdowning client.\n");
}
}
Cũng như lưu ý, khi chọn trên nhiều ổ cắm, bạn nên kiểm tra xem id socket có được đặt bằng FD_ISSET – vmpstr
không đã làm điều đó. Tôi thấy ngớ ngẩn. FD_ISSET là tiếp theo. – joels