C 客户端/服务器与 fprintf 通信?

Posted

技术标签:

【中文标题】C 客户端/服务器与 fprintf 通信?【英文标题】:C Client/Server Communicating with fprintf? 【发布时间】:2011-09-11 21:35:20 【问题描述】:

如何让服务器能够使用 printf 或 fprintf 而不是使用 write 系统调用向客户端发送消息?

我的服务器已经制作完成并且正在运行,通过 write 发送消息,但我更愿意使用 fprintf。

例如这不起作用:

newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen);
FILE *fp = fdopen(newsockfd, "w");
fprintf(fp, "test"); 
fflush(fp);

我知道有一个新问题。当我只有上面的代码时,它可以工作并且我可以在我的浏览器中看到它,但是如果我添加 read(newsockfd,buffer,255) 之后,我将不再看到发布在我的客户端中的消息。

【问题讨论】:

我认为您只是缺少fflush(fp);... 感谢先生,您很聪明。 【参考方案1】:

如何使用 dup 系统调用,所以将标准输出重定向到套接字描述符。所以我认为你可以使用 printf 将你的东西放入套接字中。

【讨论】:

【参考方案2】:

FILEs 上工作的函数不太可能像你在套接字上工作时所期望的那样做,而且很可能会给你带来麻烦。如果你想实现格式化,我建议你滚动你自己的格式化函数来写入套接字:你需要做的就是创建一个可变参数函数,调用 vsprintf 格式化并将结果发送到 writesend...

【讨论】:

我看不出您在设想什么问题。一个主要问题是阻塞 IO。无法将stdio 与非阻塞模式一起使用;这将导致FILE 出现不可恢复的错误。因此,我建议不要将 stdio 与套接字一起使用,除非(1)您只有一个正在处理的连接并且没有异步事件,或者(2)您正在使用线程并且不在乎是否阻塞。 @R.我读到使用write/send 发送格式为vsprintf 的数据...不确定分歧在哪里:p

以上是关于C 客户端/服务器与 fprintf 通信?的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 服务器,通过标准输入/标准输出与客户端通信(阻塞标准输入,直到读取了多个字节)

JAVA服务器与客户端的socket通信问题

C/S结构的程序如何实现客户端与服务端的通信

linux用java socket与c的socket通信乱码问题

Silverlight 客户端可以与 C++ 服务器通信吗?

JAVA服务器与C#客户端的通信技术调研