我写了一个简单的TCP服务器来为很多客户服务(它与telnet一起工作很棒)。但是,我想用多路复用套接字和stdin输入编写我自己的简单TCP客户端。与服务器的连接我像往常一样写,连接代码没问题。
我遇到了多路复用socket和stdin输入的问题。我的代码造成了最大的问题:
void multiplexClient(FILE *fp, int sockfd, char inbuffer[], char outbuffer[])
{
int maxfd;
fd_set rset;
FD_ZERO(&rset);
for(;;)
{
FD_SET(fileno(fp), &rset);
FD_SET(sockfd, &rset);
maxfd = std::max(fileno(fp), sockfd) + 1;
int res = select(maxfd, &rset, NULL, NULL, NULL);
if(res < 0)
{
printf("'select error\n");
}
if(FD_ISSET(sockfd, &rset))
{
if(read(sockfd, inbuffer, sizeof(inbuffer)) == 0)
printf("read error\n");
printf("Received: %s\n", inbuffer);
fflush(stdout);
memset(inbuffer, 0, sizeof(inbuffer));
}
else if(FD_ISSET(fileno(fp), &rset))
{
fprintf(stdout, "\n> ");
if(fgets(outbuffer, sizeof(outbuffer), fp) == NULL)
return;
write(sockfd, outbuffer, strlen(outbuffer));
printf("Send: %s\n", outbuffer);
fflush(stdout);
memset(outbuffer, 0, sizeof(outbuffer));
}
}
}
// int main
// sockfd = socket...
// connect
while(1)
{
multiplexClient(stdin, socket_fd, inbuffer, outbuffer);
}
// ...
return 0;
}
我的第一个客户:
$ ./client localhost 9034
hello, other client!
> Send: hel
Received: hel
Received: lo! ��~�~���~�
Received: :)
Received: wha
我的第二个客户:
$ ./client localhost 9034
hello! :)
> Send: hel
whats is wrong with this chat?!
> Send: lo!
> Send: :)
> Send:
> Send: wha
如何解决这个问题?
答案 0 :(得分:2)
你的问题就在这里(略微转述):
read(sockfd, inbuffer, sizeof(inbuffer));
printf("Received: %s\n", inbuffer);
read
调用返回写入的字节数(您忽略),缓冲区不一个C字符串(即,它不是以空值终止)。
应所拥有的内容如下:
quant = read (sockfd, inbuffer, sizeof(inbuffer));
printf ("Received: %*.*s\n", quant, quant, inbuffer);
答案 1 :(得分:1)
在将文件选择器重新添加到集合之前,您错过了FD_ZERO()
。
此外,这是C ++,因为它使用std::max()
。