【问题标题】:C++ - client-server application - recv() on server is functional, but recv() on client blocks programC++ - 客户端-服务器应用程序 - 服务器上的 recv() 可以正常工作,但客户端上的 recv() 会阻止程序
【发布时间】:2013-03-27 20:41:37
【问题描述】:

我正在编写客户端-服务器应用程序。到目前为止一切正常,客户端发送了一个请求,服务器接收到它,解析它。但是现在我想发回一个答案,所以我复制了这两个函数,我把 write() 从客户端放到服务器,把 read() 从服务器放到客户端。
当我现在运行程序时,一切都阻塞了,服务器等待,客户端也等待。当我 ctrl+c 客户端时,服务器解除阻塞并解析正确的请求并等待另一个请求。请问有什么问题吗?

来自客户端的部分代码:

  params.port = atoi(params.pvalue.c_str());  
  hostent *host;              
  sockaddr_in socketHelper;    
  int clientSocket;           
  char buf[BUFFER_LEN];     
  int size;                   
  string data;                
  string recieved;

  // gets info about server
  host = gethostbyname(params.hvalue.c_str());
  if(host == NULL) {
    printErr(ERR_HOSTNAME);
    return ERR_HOSTNAME;
  }

  // makes a socket
  if((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    printErr(ERR_SOCKET);
    return ERR_SOCKET;
  }

  socketHelper.sin_family = AF_INET;
  socketHelper.sin_port = htons(params.port);
  memcpy(&(socketHelper.sin_addr), host->h_addr, host->h_length);

  // connects the socket
  if(connect(clientSocket, (sockaddr *)&socketHelper, sizeof(socketHelper)) == -1) {
    printErr(ERR_CONNECTION);
    return ERR_CONNECTION;
  }

  // sends data
  if((size = write(clientSocket, request.c_str(), request.length())) == -1) {
    printErr(ERR_SEND);
    return ERR_SEND;
  } 

  // recieves data
  while ((size = read(clientSocket, buf, BUFFER_LEN)) != 0) {
    recieved.erase();
    recieved.append(buf, size);

    data = data + recieved;
  }

  // closes a connection
  close(clientSocket);

以及来自服务器的部分代码:

while(1) {
    int clientSocket = accept(GodParticle, (struct sockaddr*) &GodAddr, &clientSocketSize);
    if(clientSocket == -1) {
      printErr(ERR_ACCEPT);
      return ERR_ACCEPT;
    }

    if((pid = fork()) == 0) {
      while ((size = read(clientSocket, buf, BUFFER_LEN)) != 0) {
        recieved.erase();
        recieved.append(buf, size);

        request = request + recieved;
      }

      parserInput(request);
      getData();
      parserOutput();

      if((size = write(clientSocket, sendback.c_str(), sendback.length())) == -1) {
        printErr(ERR_SEND);
        return ERR_SEND;
      } 

      close(clientSocket);
      exit(ERR_OK);
    }
  }

【问题讨论】:

标签: c++ client-server


【解决方案1】:

好的,让我这样回答。 recv() 默认情况下会阻止您的程序,直到它从服务器接收到一些消息。

而recv()之所以不会阻塞你的服务器程序,是因为你使用fork()创建了一个子进程。

所以你必须使用其他方法来避免这个块(可能像使用 select 或其他一些东西)。

【讨论】:

  • 我使用 fork() 是因为我需要处理更多的客户端。我必须在那里。是我用错了还是为什么会阻止发送?
  • @2rec 我对我的回答做了一些补充,请看一下:P
猜你喜欢
  • 1970-01-01
  • 2018-01-20
  • 2021-05-24
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多