c - tcp 客户端 服务器 p2p

标签 c sockets tcp network-programming

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/

相关文章:

python - python 中的 TLS echo 服务器和 echoclient 崩溃

c# - NetworkStream.DataAvailable 更新缓慢

c - lseek() 尝试使用字节文件,但指针是 FILE 类型

c - 为什么 while(*s++ == *t++) 不能比较两个字符串

c - bpf_trace_printk 格式指针

Java:确定 TCP 套接字何时变慢并重新建立连接

javascript - 可以获取网站的事件 Websocket 吗?

sockets - 带多宿主的 SCTP 作为 TCP 的直接替代

php - 如何通过套接字安全地发送二进制数据并确保没有人可以重新发送它?

c - 使用c进行套接字编程时连接到远程服务器时出错