我找了一个非常相似的主题的回答,但我找不到一个好的答案(我认为)。
首先是我的代码:
fd_set readset;
int result;
while(1) {
FD_ZERO(&readset);
FD_SET(sock_client, &readset);
FD_SET(fileno(stdin), &readset);
result = select(sock_client + 1, &readset, NULL, NULL, NULL);
if (result > 0) {
if (FD_ISSET(sock_client, &readset)) {
memset(buffer, 0, sizeof(buffer));
read(server_socket, buffer, 5000);
printf("%s", buffer);
}
if (FD_ISSET(fileno(stdin), &readset)) {
memset(msg, 0, sizeof(msg));
read(fileno(stdin), msg, 5000);
printf("%s", msg);
}
}
}
编辑(更正了读取()中的错误):
// socket client
sock_client = do_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// socket server
server_socket = do_socket(AF_INET, SOCK_STREAM, 0);
// server connexion
do_connect(server_socket,
(struct sockaddr *) & addr_sock_host, sizeof(addr_sock_host));
fd_set readset;
int result;
while(1) {
FD_ZERO(&readset);
FD_SET(sock_client, &readset);
FD_SET(fileno(stdin), &readset);
result = select(sock_client + 1, &readset, NULL, NULL, NULL);
if (result > 0) {
if (FD_ISSET(sock_client, &readset)) {
memset(buffer, 0, sizeof(buffer));
int size = read(sock_client, buffer, 5000);
printf("size : %i\n", size);
}
if (FD_ISSET(fileno(stdin), &readset)) {
memset(msg, 0, sizeof(msg));
read(fileno(stdin), msg, 5000);
printf("%s", msg);
}
}
}
当我运行它时:
size : -1
size : -1
size : -1
size : -1
size : -1
size : -1
size : -1
size : -1
......无限
END OF EDIT
实际上,select总是返回1,因为sock_client总是在readset中,而没有什么可读的。更多,我的FD_SET处于无限循环中。这就是为什么我不明白为什么sock_client被检测为可读(总是)?
我希望你能理解我的问题,如果已经提出问题我会道歉。
由于
答案 0 :(得分:2)
你不需要memset(),
,你无法说服我从侦听套接字块中读取。这里真正的问题是你:
read()
返回的值。你需要:
perror()
或其中一位朋友,然后关闭套接字。memset()
。