[英]I can't understand the result of this chatting program
所以我做了一个简单的服务器-客户端程序,可以使用fifo文件(msgfifo)相互通信。
我的问题是:当我键入一条包含空格的消息时,接收器进程会以字数运行多次。
这不是我所期望的,因为我希望将它作为一个完整的句子打印出来,但事实并非如此,我想知道为什么。
当我输入要发送的内容时,进程会向另一个发送 SIGUSR1 信号。
/* receive msg part */
/* added this using sigset(SIGUSR1, receiveSIGUSR1) */
void receiveSIGUSR1()
{
char* msg = "\nIncoming Message from client...";
char* msg2 = "\nClient : ";
char buf[max_of_msg];
int fd;
write(1, msg, strlen(msg)+1);
fflush(stdin);
if( (fd = open("./msgpipe", O_RDONLY)) < 0)
{ perror("open"); exit(1); }
read(fd, buf, max_of_msg);
close(fd);
write(1, msg2, strlen(msg2)+1);
write(1, buf, strlen(buf)+1);
flag = 0;
}
/*send msg part*/
while(1)
{
flag = -1;
printf("\nType what u want to send : ");
scanf(" %s", msg);
if(flag == 0) continue;
printf("msgtaken\n");
fflush(stdin);
if( (fd = open("./msgpipe", O_RDWR)) < 0)
{ perror("exit"); exit(1); }
kill(clpid, 30);
sleep(2);
printf("Send message to Client..\n");
write(fd, msg, max_of_msg);
printf("Message Sent...\n");
}
预期的:
客户端:你好服务器这是客户端
实际:/* 服务器 */
来自客户端的传入消息...
你好
来自客户端的传入消息...
这个
来自客户端的传入消息...
是
来自客户端的传入消息...
客户
输入您要发送的内容:
/客户/
输入您要发送的内容:Hello Server This is client
留言
向服务器发送消息..
消息已发送
输入您要发送的内容:msgtaken
向服务器发送消息..
消息已发送
输入您要发送的内容:msgtaken
向服务器发送消息..
消息已发送
输入您要发送的内容:msgtaken
向服务器发送消息..
消息已发送
输入您要发送的内容:msgtaken
向服务器发送消息..
消息已发送
输入您要发送的内容:
那是因为它是这样接受输入的:
scanf(" %s", msg);
我们来看看scanf
的文档(重点是我的):
s:任意数量的非空白字符,在找到的第一个空白字符处停止。 在存储序列的末尾自动添加终止空字符。
这就是为什么当您发送Hello Server this is client
时它在Hello
之后停止的原因。 还要注意" %s"
的空格,这意味着它也将忽略输入开头的任何空格。 因此,当它在下一次循环中读取Server
时,这使它忽略了Hello
和Server
之间的空间。 结果,它循环了五次,每次的消息都是Hello
, Server
, this
, is
和client
。
相反,您可以使用getline
:
char *message = NULL;
size_t length;
getline(&message, &length, stdin);
// use message
free(message);
小提示:为了使您的scanf
调用更安全,您可以指定字符串输入的最大大小:
scanf(" %99s", msg);
每个示例,这意味着对于 100 的缓冲区大小,只能读入 99 个char
,加上一个空终止符。这样您就可以避免如果用户输入的字符串对于您来说太大而不会发生未定义的行为缓冲。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.