【问题标题】:tcp client server p2ptcp 客户端 服务器 p2p
【发布时间】:2014-07-29 11:01:32
【问题描述】:

connect() 系统调用需要放在 tcp 服务器的上下文中的什么位置才能同时用作客户端和服务器系统?我需要构建一个 p2p 客户端/服务器系统。服务端进程模板为:create server_socket, bind, listen, loop(accept, fork, send/recv),客户​​端模板为:create client_socket, connect。我可以这样做吗?

sockfd=socket(AF_INET, SOCK_STREAM, 0);
bind(sockfd, &saddr, sizeof(saddr));
listen(sockfd,5);  //listen for connections
connect(sfd,&destaddr,sizeof(destaddr);  //send connection request elsewhere
while(1){
  newsock=accept(sockfd,NULL,NULL);
  if(fork()==0){
    close(sockfd);
    send/recv;
  }
close(newsock);
}

另外,将connect() 放在while 循环中或fork() 之后会不会出错?我对 while 循环和 fork 的解释有点困惑。我的目的是在多台机器上运行相同的程序并相互连接。通过这个实现,当我尝试连接到另一个 p2p 主机(运行相同的客户端/服务器组合)时,我得到一个 connection denied 错误。我可以在哪里放置 connect() 以确保程序既可以连接外部又可以接受传入的连接?

【问题讨论】:

  • 你在需要连接的时候使用connect函数。
  • 我不清楚你的问题是什么。显然,您知道如何使用该功能。请澄清问题以使其易于回答。
  • 我的问题是当我尝试在多台机器上运行该程序并获得连接被拒绝错误时。另外,我不明白为什么需要一个while循环和一个fork来接受连接。不只是 fork() 可以解决这个问题吗?

标签: c sockets tcp network-programming


【解决方案1】:

当你为“服务器系统”做套接字编程时,你需要使用以下系统函数-

  1. socket()
  2. bind()
  3. listen()
  4. accept()
  5. read()/write()// 接收/发送
  6. close()

对于“客户端系统”-

  1. socket()
  2. connect() // 客户端连接服务器的连接系统调用。不要在服务器端使用它
  3. read()/write()// 接收/发送
  4. close() - 这个功能就够了。

服务端进程的模板是:create server_socket, bind, listen, loop(accept, fork, send/recv) 客户端模板是:create client_socket, connect and send/recv。我可以这样做吗? --- 是的。有了这个你就可以做到!

但我认为您的服务器代码 sn-p(所以不要在服务器中使用 connect())。尝试以下更改-

对于每个系统调用检查它是否成功都不是。成功时所有此系统函数返回 0,失败时所有此函数返回 -1。所以只有你自己会知道你在哪里犯了错误。

对于服务器端-

int sockfd,newsocket;
socklen_t addrlen;
struct sockaddr_in saddr;
struct sockaddr_in destaddr;

sockfd=socket(AF_INET, SOCK_STREAM, 0); 
bind(sockfd,(struct sockaddr *)&saddr, sizeof(saddr));
listen(sockfd,5);  //listen for connections
while(1){
    newsock=accept(sockfd,(struct sockaddr *)&destaddr,&addrlen); 
    //Check this accept system call. you should not use NULL for 2nd and 3rd arguments
    if(fork()==0){
    close(sockfd);
    send/recv;
  }
  close(newsock);
}

在客户端-

int sfd;
struct sockaddr_in saddr;

sockfd=socket(AF_INET, SOCK_STREAM, 0);
connect(sfd,(struct sockaddr *)&saddr,sizeof(saddr);
send/recv
close(sfd);

[注意]:如果您是 Socket 编程新手,请先尝试使用单客户端系统的服务器。如果你得到了输出,那么你可以尝试使用多个客户端的服务器。但是当你为单客户端的服务器做程序时,服务器进程的模板是:创建server_socket、bind、listen、accept、发送/接收和close。客户端模板为:创建client_socket、connect、Send/recv 和close。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2012-01-04
    • 2013-02-17
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多