繁体   English   中英

C TCP / IP套接字:如何将输入从客户端套接字同步到服务器套接字以交替进行

[英]C TCP/IP Sockets: How to synchronise input from client sockets to a server socket to be alternating

我有一个最终要制作成井字游戏客户端-服务器游戏的程序,但是我目前正在通过发送和打印消息来测试通信。 我可以接受服务器从多个客户端接收消息的点,但是当我尝试强制它在客户端之间交替时,整个事情都会失败,例如从客户端1,然后从客户端2,然后再从1接受输入,等等。可以肯定,我只是以一种非常错误的方式来做这件事。

这是形成连接并与客户端通信的代码。

listen(sockfd,5);
clilen = sizeof(cli_addr);


//client1
clientsockfd[0] = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (clientsockfd[0] < 0) {
  perror("ERROR on accept");
  exit(1);
}

//client2
clientsockfd[1] = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (clientsockfd[1] < 0) {
  perror("ERROR on accept");
  exit(1);
}

while (1) {

  //create child process for each client
  pid1 = fork();
  if (pid1 < 0) {
     perror("ERROR on fork");
     exit(1);
  }

  //client1
  if (pid1 == 0) {
     /* This is the client process */
     close(sockfd);
     doprocessing(clientsockfd[i]);

  }
  //client2
  if(pid2 == 0){
      close(sockfd);
      doprocessing(clientsockfd[i]);
      //functions
  }

  i++;

}

我也尝试在第一次叉子内第二次分叉,但也失败了。

这是client.c中与服务器通信的部分。

 if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
   perror("Error connecting: ");
   exit(1);
}

while(1){

      //ask for message to be read by server
      printf("Please enter the message: ");
      bzero(buffer,256);
      fgets(buffer,255,stdin);

      // send message
      n = write(sockfd, buffer, strlen(buffer));

      if (n < 0) {
         perror("Error writing to socket: ");
         exit(1);
      }

      //empty buffer
      bzero(buffer,256);

      //read reply from server
      n = read(sockfd, buffer, 255);
      if (n < 0) {
         perror("Error reading from socket: ");
         exit(1);
      }

      printf("%s\n",buffer);
}
return 0;
}

另外,如果有必要,这里还有doprocessing函数

void doprocessing (int sock) {
int n;
char buffer[256];
bzero(buffer,256);
n = read(sock,buffer,255);

if (n < 0) {
  perror("ERROR reading from socket");
  exit(1);
}

printf("Here is the message: %s\n",buffer);
n = write(sock,"I got your message",18);

if (n < 0) {
  perror("ERROR writing to socket");
  exit(1);
}

}

运行该程序时,我得到的是:在连接第二个客户端时,出现了一个无限循环,其中:

从套接字读取错误:错误的文件描述符

重复多次,然后:

前叉发生错误:资源暂时无法使用

出现两次,最后:

从套接字读取错误:输入/输出错误

不断重复直到我强制终止程序。 如果我省略了任何必要的信息,请告诉我,我将添加它。 谢谢。

    while (1) {
        pid = fork();
        ....
        i++;
    }

创建太多子进程,最终导致派生失败。

每个孩子都使用clientsockfd[i] 实际上只分配了其中两个。 同时i成长为无限。 第三个进程已经获得了一个垃圾套接字(这也是一个越界访问,因此是UB),它解释了IO错误。

考虑改为一次性分叉客户,然后

    while (1) {
       doprocessing(clientsockfd[0]);
       doprocessing(clientsockfd[1]);
    }

在主线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM