接受pthread内的连接

时间:2013-06-06 13:06:32

标签: linux sockets pthreads

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

警告:自从我考虑FTP服务器以来已经很长时间了,但这是被动模式的基本概要。

答案 1 :(得分:0)

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


此外,您可能最好还是运行脱离的线程,因此无需加入它们,就像在当前设计中至少连接主服务器一样。