gpt4 book ai didi

c - tcp 客户端 服务器 p2p

转载 作者:行者123 更新时间:2023-11-30 17:30:43 24 4
gpt4 key购买 nike

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 主机(运行相同的客户端/服务器组合)时,我收到连接被拒绝错误。我可以在哪里放置 connect() 以确保程序既连接外部又接受传入连接?

最佳答案

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

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

对于“客户端系统”-

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

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

但我认为你的服务器代码片段(所以不要在服务器中使用 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 编程新手,请首先尝试使用单客户端系统的服务器。如果您得到了输出,那么您可以尝试使用具有多个客户端的服务器。但是,当您为单个客户端的服务器编写程序时,服务器进程的模板是:create server_socket, bind, listen, 接受、发送/接收和关闭。客户端模板为:create client_socketconnect、Send/recv 和 close

关于c - tcp 客户端 服务器 p2p,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25013771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com