当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [求助]socket编程时遇到的问题,希望有人能指教
帖子发表于 : 2009-05-29 22:08 

注册: 2008-01-04 20:57
帖子: 155
送出感谢: 0 次
接收感谢: 0 次
原本的代码如下,每次我调用startServer时,ServerSocket都能正常都能正常创建、绑定,侦听,但每调用acceptClient都会报错说bad file descriptor。我debug过,ServerSocket中的servSock确实已被正确创建(记得是4)。

后来我尝试修改了代码,放弃了用ServerSocket来封装socket,竟然能够正确运行,不知道是为什么,上网查了很久,一直找不到原因所在,望有人能指点迷津,不胜感激
代码:
// 这是运行服务器的函数
void ProxyServer::startServer() {
   ServerSocket servSock;

   // Initialize to handle singnals.
   initSignalHandler();

   // Create server socket.
   try {
      servSock = ServerSocket(8080, 10);
   } catch (const char * errMsg) {
      cout << errMsg << "\nProxy server exit" << endl;
      exit(-1);
   }

   cout << "Start http proxy server on port " << port << endl;

   // Handle client connection.
   int cliSock;
   while (true) {
      try {
         cliSock = servSock.acceptClient();
         ThreadFactory::createThread(cliSock);
      } catch (const char * errMsg) {
         cout << errMsg << endl;
         static int i = 0;
         if (i++ < 3) {
            continue;
         } else {
            exit(-1);
         }
      }
   }
}


// 以下是将socket进行封装的类,头文件就不列出来了

class ServerSocket {
   private:
      int servSock;
   public:
      ServerSocket();
      ServerSocket(int port, int queueLength);
      ~ServerSocket();
      int acceptClient();
};

ServerSocket::ServerSocket() {
}

ServerSocket::ServerSocket(int port, int queueLength) {
   struct sockaddr_in serverAddr; // Build out address here.

   servSock = socket(AF_INET, SOCK_STREAM, 0); // Get a socket.

   if (servSock == -1) {
      perror("");
      throw "Create socket error";
   }

   // Build address and build it to socket.
   bzero((void *)&serverAddr, sizeof(serverAddr)); // Clear out struct.
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); // Fill in the address.
   serverAddr.sin_port = htons(port); // Fill in socket port.
   if (bind(servSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 0) {
      perror("");
      throw "Bind socket error";
   }

   // Arrange for incoming calls.
   if (listen(servSock, queueLength) != 0) {
      perror("");
      throw "Listen socket error";
   }
}

ServerSocket::~ServerSocket() {
   if (servSock > 0) {
      if (close(servSock) != 0)
         perror("Close socket failure");
   }
}

int ServerSocket::acceptClient() {
   int cliSock;

   while ((cliSock = accept(servSock, (sockaddr *)NULL, NULL)) <= 0) {   [color=#BF0040]出问题的地方,总是报bad file descriptor[/color]
      if (cliSock <= 0) {
         if (errno == ECONNABORTED) {
            continue;
         } else {
            perror("");
            throw "Client Connect error";
         }
      }
   }

   return cliSock;
}


修改后的代码
代码:
void ProxyServer::startServer() {
   int servSock;
   struct sockaddr_in serverAddr; // Build out address here.

   servSock = socket(AF_INET, SOCK_STREAM, 0); // Get a socket.

   if (servSock == -1) {
      perror("");
      throw "Create socket error";
   }

   // Build address and build it to socket.
   bzero((void *)&serverAddr, sizeof(serverAddr)); // Clear out struct.
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); // Fill in the address.
   serverAddr.sin_port = htons(port); // Fill in socket port.
   if (bind(servSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 0) {
      perror("");
      throw "Bind socket error";
   }

   // Arrange for incoming calls.
   if (listen(servSock, 5) != 0) {
      perror("");
      throw "Listen socket error";
   }

   // Initialize to handle singnals.
   initSignalHandler();

   cout << "Start http proxy server on port " << port << endl;

   // Handle client connection.
   int cliSock;
   while (true) {
      try {

         while ((cliSock = accept(servSock, (sockaddr *)NULL, NULL)) <= 0) {
            if (cliSock <= 0) {
               if (errno == ECONNABORTED) {
                  continue;
               } else {
                  perror("");
                  throw "Client Connect error";
               }
            }
         }

         ThreadFactory::createThread(cliSock);
      } catch (const char * errMsg) {
         cout << errMsg << endl;
         static int i = 0;
         if (i < 10) {
            continue;
         } else {
            return;
         }
      }
   }
}


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译