打印从一个插槽一次收到的字符

时间:2013-09-19 16:15:13

标签: c++ c linux sockets

我正在开发一个程序,我必须通过套接字一次发送一个char。连接工作正常并且字符正在发送但是当我必须将它们打印到stdout时,我无法在没有换行符的情况下打印它们。

for ( ; ; ) {
            nb = select(connfd+1, &read_set, NULL, NULL, NULL);
            if (nb<=0) {
                printf("Error\n");
            }else{
                if (FD_ISSET(connfd, &read_set)) {
                    char buff[2];
                    nb = read(connfd, buff, 4096);
                    if (nb < 0){
                        printf("The client disconected\n");
                        break;
                    }
                    printf("%s\n",buff); // this prints them with a new line between each char.Removing the \n will make it work only by hitting enter
                    //fputs(buff,stdout); //does the same as printf without \n
                }

再提一点:客户端发送字符而不等待stdin的ENTER。

任何提示? 感谢

3 个答案:

答案 0 :(得分:4)

1)不要欺骗read - 它往往几乎总会导致坏事:

                char buff[2];
                nb = read(connfd, buff, 4096);

这应该是:                     char buff [2];                     nb = read(connfd,buff,1);

2)你需要终止字符串:

buff[1] = 0; 

2a)printf("%s", buff)实际上不会显示任何内容,因为没有新行强制将缓冲的数据实际写入屏幕 - 使用fflush(stdout);来强制它。

3)在标准C ++(或C)中无法读取字符而无需等待“输入”。我建议你看一下ncurses函数包吗?

答案 1 :(得分:2)

                printf("%s\n",buff);

对于C风格的字符串,%s格式说明符仅 。由于buff不是C风格的字符串,这是错误的。也:

                char buff[2];
                nb = read(connfd, buff, 4096);

如何将最多4096个字符读入一个仅足够2的缓冲区?你可能想要:

                char buff[4096];
                nb = read(connfd, buff, 4096);
                if (nb < 0){
                    printf("The client disconected\n");
                    break;
                }
                for (int i = 0; i < nb; ++i)
                   putchar(buff[i]);
                fflush(stdout);

答案 2 :(得分:1)

您需要刷新缓冲区。在printf来电之后,也请致电fflush(stdout)

此外,由于您尝试一次打印1个字符,因此还有其他一些问题:

char buff; // you wanted to read 1 character at a time
nb = read(connfd, &buff, 1); 
if (nb < 1)
{
    printf("The client disconected\n");
    break;
}
printf("%c", buff);
fflush(stdout);