为什么在使用printf将udp通信的输出的内容重定向到命名管道中会发生阻塞现象,但是使用cout不会?
问题在函数udpRecv中
static void userage()
{
printf("请输入正确的启动命令:./udp_server serverIP serverPort\n");
}
void *udpRecv(void *arg)
{
int sock = *(int *)arg;
// if (bind(sock, (struct sockaddr*)&line, sizeof line) < 0)
// {
// logging(FATAL, "%d : %s\n", errno, strerror(errno));
// }
char buff[1024];
while (true)
{
memset(buff, 0, sizeof buff);
struct sockaddr_in line;
socklen_t len = sizeof line;
ssize_t s = recvfrom(sock, buff, sizeof buff, 0, (struct sockaddr *)&line, &len);
if (s > 0)
{
buff[s] = 0;
// printf("%s\n", buff); // 会阻塞管道文件
std::cout << buff << std::endl;
}
}
return nullptr;
}
void *udpSend(void *arg)
{
int sock = *(int *)arg;
struct sockaddr_in line;
bzero(&line, sizeof line);
line.sin_family = AF_INET;
line.sin_port = htons(serverPort);
line.sin_addr.s_addr = inet_addr(serverIp.c_str());
std::string sendMessage;
while (true)
{
// perror("请输入您的数据#");
std::cerr << "请输入您的数据#";
std::getline(std::cin, sendMessage);
sendto(sock, sendMessage.c_str(), sendMessage.size(), 0, (struct sockaddr *)&line, sizeof line);
}
return nullptr;
}
int main(int argc, char *args[])
{
if (argc != 3)
{
userage();
exit(1);
}
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
{
logging(FATAL, "%d : %s\n", errno, strerror(errno));
exit(2);
}
serverPort = atoi(args[2]);
serverIp = args[1];
std::unique_ptr<Thread> reciver(new Thread(1, udpRecv, (void *)&sock));
std::unique_ptr<Thread> sender(new Thread(2, udpSend, (void *)&sock));
sender->start();
reciver->start();
sender->join();
reciver->join();
close(sock);
return 0;
}