0

我正在Linux 上用 C 语言编写一个简单的即时通讯程序。

现在我有一个程序将套接字绑定到本地机器上的端口,并侦听连接到我的本地机器 IP 和端口的另一个程序发送的文本数据。

好吧,我可以让这个客户端向我的程序发送文本数据,并stdout在我的本地机器上显示它;但是,我无法编写将数据发送回客户端机器的方法,因为我的程序正忙于侦听和显示客户端机器发送的文本。

我将如何创建一个新进程(监听并显示客户端机器发送给它的文本,然后获取该文本并将其发送到另一个程序的stdout,而另一个程序负责stdin发送到客户端机器) 或创建 2 个程序来执行单独的工作(发送、接收和显示),并将适当的数据相互发送?

抱歉,如果这措辞很奇怪,我会澄清是否需要。我查看了exec, execve,fork等,但我很困惑这是否是合适的查看路径,或者是否有更简单的方法我错过了。

任何帮助将不胜感激,谢谢。

编辑:回想起来,我认为使用 2 个单独的程序会更容易完成。一个是 IM 服务器,另一个是 IM 客户端。

IM 客户端将连接到 IM 服务器程序,并将他们想要的任何文本发送到 IM 服务器。然后,IM 服务器只需将发送给它的数据记录在缓冲区/文件中,并将客户端的名称/IP 附加到每个客户端发送给它的文本中,并将该文本(以名称:文本的格式)发送到每个连接的客户端。

这将消除对和的复杂进程间/程序通信的需要stdinstdout而是使用简单的客户端/服务器通信方式,客户端程序显示从服务器发送给它的文本stdout,并使用stdin发送任何文本到服务器。

话虽如此,我仍然对有人回答我最初的问题感兴趣:科学。感谢大家的阅读,希望有人能从我的头脑风暴或来自社区的任何答案中受益。

4

3 回答 3

3

但是,我无法编写将数据发送回客户端计算机的方法,因为我的程序正忙于侦听和显示客户端计算机发送的文本。

从监听套接字返回的同一个套接字accept()可用于发送和接收数据。所以你的套接字永远不会因为你正在读取它而“忙”......你可以在同一个套接字上写回。

如果您需要同时读取和写入,则共享从accept()两个不同线程返回的套接字。由于网络堆栈使用两个不同的缓冲区在套接字上发送和接收,因此一个用于读取的专用线程和另一个用于写入套接字的专用线程将是线程安全的,无需使用互斥锁。

于 2012-01-15T06:24:40.363 回答
0

我会使用 fork() - 创建一个子进程,现在你有两个不同的进程可以在两个不同的套接字上做两件不同的事情——一个可以接收,另一个可以发送。我还没有像这样编写客户端/服务器的个人经验,但这将是我第一次尝试解决您的问题......

于 2012-01-15T06:11:40.253 回答
0

正如@bdonlan 在评论中提到的那样,您肯定需要一个多路复用调用,如select或最好是poll(或相关的系统调用,如pselectppoll...)。这些多路复用调用是一次在多个通道上等待的原语(具有pselect并且 ppoll能够以原子方式等待 I/O 事件和信号)。另请阅读选择教程手册页。当然,您可以等待多个文件描述符,并且您可以在同一个selectpoll系统调用中等待读取和写入能力(即使在同一个套接字上,如果需要)。

所有基于事件的循环和框架都在使用这些多路复用调用(如pollor select)。您还可以使用libevent,甚至(特别是在编写图形用户界面应用程序时)一些 GUI 工具包,如 Gtk 或 Qt,它们都基于中央事件循环。

我认为拥有多进程或多线程应用程序在您的情况下没有用。你只需要一些事件循环。

SIGIO当数据到达您的套接字时,您可能还要求使用fcntl with获取信号F_SETOWN,但这对您来说不是很有用。然后你经常希望你的套接字是非阻塞的。

于 2012-01-15T08:35:03.653 回答