0

我希望有人可以帮助我解决我的问题。我尝试使用 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 错误!-我真的不知道有什么问题。-谢谢你的帮助。

4

2 回答 2

0

thread-2 使用的数据交换端口应该是 thread-1 在与客户端执行会话确认期间预先选择的随机端口。


此外,您可能最好分离运行线程,因此无需加入它们,因为在当前设计中至少加入块主服务器。

于 2013-06-06T17:09:04.617 回答
0

(1) 在我看来,您一次只能运行一个客户端线程 (pthread1)。在main()你将阻塞pthread_join直到第一个线程完成。因此,如果您继续沿着这条路走下去,您要么必须将这些线程创建为分离的,要么使用另一种方法来加入 thread1。或者,更好的是,使用线程池。

(2) 我的猜测是您的第二次bind失败,因为它在第一次连接后已经在使用。即使第一个连接在建立第二个连接之前关闭它,在它再次可用之前也存在时间延迟。你可以绕过这个滞后,但这不是处理这个问题的方法。

而是让第二个bind选择自己的侦听端口。为此,您在传递给的地址结构中指定端口 0 bind。然后系统会为你选择一个监听端口,而不是所有被硬编码在 8889 上运行的端口。你显然必须告诉客户端(通过在 pthread1 中建立的控制连接)“嘿,在这个端口上连接到我来传输数据”反过来,客户端必须建立连接。根据上面的大纲,您需要进行一些设计更改才能实现这一点。

另一种方法显然是只保留硬编码的 8889 侦听端口,但只绑定一次。这有一些问题,但如果这只是一个练习,显然很容易实现。

警告:我已经很久没有想到 FTP 服务器了,但这是被动模式的基本轮廓。

于 2013-06-06T15:03:11.260 回答