我希望有人可以帮我解决我的问题。 我尝试使用C,
创建客户端/服务器FTP应用程序我的程序实现是这样的:
main()
{
1)create socket
2)bind on port 8888
3)listen
5) while(accept)
{
5) create pthread1 to handle the connection using function1
6)join the pthread1
}
}
function 1()
{
1)take the file descriptor from the main
2) discusses with client using the descriptor (send/recv)
3) create pthread2 to handle data exchange
4) join the pthread 2
5)free the descriptor
}
function 2()
{
1)create socket
2)bind on port 8889
3)listen
4)accept
}
我的问题: - 当我尝试第一个客户端时,一切正常,两个连接都做得很好! - 当我尝试第二个客户端时,第一个连接正常,但第二个连接发出BIND错误! - 我真的不知道这是什么问题。 - 谢谢你的帮助。
答案 0 :(得分:0)
(1)在我看来,你一次只能运行一个客户端线程(pthread1)。在main()
中,您将阻止pthread_join
,直到第一个线程完成。因此,如果您继续沿着这条路走下去,您将要么将这些线程创建为已分离,要么使用其他方法来连接thread1。或者,更好的是,使用线程池。
(2)我的猜测是你的第二个bind
失败,因为它在第一次连接后已经被使用了。即使第一个连接在建立第二个连接之前关闭它,也有时间滞后才能再次使用。你可以解决这个问题,但这不是处理这个问题的方法。
而是让第二个bind
选择自己的侦听端口。为此,请在传递给bind
的地址结构中指定端口0。然后,系统将为您选择一个监听端口,而不是在8889上运行硬编码的所有内容。您显然必须告诉客户端(通过pthread1中建立的控制连接)“嘿,在此端口上连接到我以传输数据”反过来,客户必须建立连接。从上面的大纲中,您需要进行一些设计更改才能实现这一目标。
另一种方法显然是保留硬编码的8889侦听端口,但只绑定一次。这有一些问题,但如果这只是一个练习,那么显然很容易实现。
警告:自从我考虑FTP服务器以来已经很长时间了,但这是被动模式的基本概要。
答案 1 :(得分:0)
thread-2使用的数据交换端口应该是在通过thread-1与客户端执行的会话确认期间预先选择的随机端口。
此外,您可能最好还是运行脱离的线程,因此无需加入它们,就像在当前设计中至少连接主服务器一样。