程序中的两个主管

时间:2011-07-15 13:35:12

标签: c networking client-server

情况如下:我需要将数据发送到邻居(套接字),然后切换到监听模式。我在client.c中有一个客户端部分,它只是监听,而server.c中的服务器部分 - 发送数据。使用套接字我需要在它们中都有main()。我应该如何让它们“合作”在一起,因此mains两个都不会导致错误?

或者其他任何想法如何通过发送和收听来解决这个问题?

提前致谢!

卢卡斯

3 个答案:

答案 0 :(得分:3)

您始终可以从源创建两个可执行文件。他们每个人都有自己的main

或者,您可以创建单个可执行文件并让它fork另一个进程或创建另一个线程。创建新线程时,您将指定第二个“main”作为线程函数。

fork时,你应该创建两个函数main_servermain_client,并让实际main决定调用哪个函数,就在{{1}之后}}。请参阅代码段:

fork

希望它有所帮助。

注意:最好创建一个单独的可执行文件,但如果您只需要一个,请使用上面的代码段。

答案 1 :(得分:1)

要记住的是,这些程序将编译成单独的二进制文件,这些二进制文件将成为单独的进程。您将启动“服务器”程序(将运行其主程序),然后启动客户端程序(将运行其主程序)。他们通过您正在创建的套接字进行通信。

答案 2 :(得分:0)

另一种解决方法是使用“select()”方法。这仅适用于Linux / Unix环境中的套接字编程。使用此功能,您可以在同一个main()中完成发送和侦听任务。这是这个方法的教程。

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#selectman

它的作用是不是使用fork()而是将所有套接字放在read_set中。然后它进入一个无限的do-while()循环。现在这对于Linux / Unix中的套接字编程非常有用。在Linus / Unix中,每个套接字都会被分配一个文件描述符(FD),在该文件描述符中,它们会写入数据,然后进行传输。它将I / O控制台视为FD。因此它将控制台FD置于read_set中,然后将所有其他侦听端口置于read_set中,然后等待来自任何上述FD的数据。因此,如果您在控制台中有数据,它将选择FD并执行您编写的任务。或者在您关闭程序之前将处于聆听模式。

现在这比fork()更好,因为在使用fork()时,如果没有正确处理,它可能会创建一个fork-bomb,它会以递归方式创建进程并炸毁你的主内存。因此,创建单个流程并在其中具有两种功能更好。