情况如下:我需要将数据发送到邻居(套接字),然后切换到监听模式。我在client.c
中有一个客户端部分,它只是监听,而server.c
中的服务器部分 - 发送数据。使用套接字我需要在它们中都有main()
。我应该如何让它们“合作”在一起,因此mains
两个都不会导致错误?
或者其他任何想法如何通过发送和收听来解决这个问题?
提前致谢!
卢卡斯
答案 0 :(得分:3)
您始终可以从源创建两个可执行文件。他们每个人都有自己的main
。
或者,您可以创建单个可执行文件并让它fork
另一个进程或创建另一个线程。创建新线程时,您将指定第二个“main”作为线程函数。
在fork
时,你应该创建两个函数main_server
和main_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,它会以递归方式创建进程并炸毁你的主内存。因此,创建单个流程并在其中具有两种功能更好。