2013-11-25 62 views
0

我正在用C++编程一个TCP服务器,这是我第一次这样做。我遇到的问题似乎是strcmp函数的底部。我建立了服务器,然后分叉我的进程并运行子进程的请求。这工作正常。由于某种原因,当我输入GET /stuff/时,它将不会接受GET并自动打印错误消息"Invalid first argument"。我没有空间问题,那么交易是什么?任何想法都非常感谢。TCP服务器C++/Unix命令行

void processClientRequest(int connSock, struct sockaddr_in echoclient) //char *argv[]) 
{ 
    char buffer[256]; 
    unsigned int recieved, count = 0; 

    if ((recieved = read(connSock, buffer, 256)) < 0) { //read a message from the client 
      perror ("Failed to recieve message"); 
      exit (EXIT_FAILURE); 
    } 

    buffer[recieved] = '\0'; //ensure string is terminated 
    chomp(buffer); //remove trailing \r and \n 

    if (write(connSock, buffer, recieved) != recieved) { 
      perror ("Mismatch in number of echo'd bytes"); 
      exit(EXIT_FAILURE); 
    } 

    // prepare argv array of strings 
    char *argv[] = { (char*)0, (char*)0, (char*)0, (char*)0, (char*)0, (char*)0, (char*)0 }; 

    // parse command into words 
    for (char *p = strtok(buffer, " "); p; p = strtok(NULL, " ")) 
      { argv[count] = p; 
        count++; 
      } 

    cout << "THIS IS ARGV[0]" << argv[0] << endl; //debugging, for some reason will not print 

    if (strcmp (argv[0], "GET") == 0) 
      GET(connSock, argv[1]); 

    else if (strcmp(argv[0], "INFO") == 0) 
      INFO(); 

    else 
    { 
      perror("Invalid first argument!"); 
      exit(EXIT_FAILURE); 
    } 

    // run command and its arguments via execvp 
    /*  if (execvp(argv[0], argv) < 0) { 
      perror("exec in child after fork"); 
      exit(EXIT_FAILURE); 
      }*/ 

    cerr << "Client(" << inet_ntoa(echoclient.sin_addr) << ") sent: " << buffer << endl; 

} 
+0

抱歉是迂腐,但它应该'收到';) – KevinDTimm

+0

如果你编写C++为什么不使用[POCO](http://pocoproject.org/docs/Poco.Net.html)? – Scony

回答

1

read函数不接收消息,它接收字节。如果你想接收消息,那么你需要必须写一个函数来接收它们。这需要遵循HTTP协议的规则来保持接收字节,直到你获得完整的消息,无论是一行还是整个头文件或其他东西。

这可能被说成千上万次,“TCP是一种可靠的字节流协议,它不保留应用程序消息边界。”在你100%理解TCP是什么之前,不要编写使用TCP的代码。它永远不会正常工作。