gpt4 book ai didi

c++ - TCP 服务器 C++/Unix 命令行

转载 作者:行者123 更新时间:2023-11-28 07:16:16 25 4
gpt4 key购买 nike

我正在用 C++ 编写 TCP 服务器,这是我第一次这样做。我遇到的问题似乎是 strcmp 函数的底部。我已经建立了服务器,然后我 fork 我的进程并运行来自子进程的请求。这很好用。出于某种原因,当我输入 GET/stuff/ 时,它不会接受 GET 并自动打印错误消息 “Invalid first argument”。我没有空间问题,那有什么关系呢?非常感谢任何想法。

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;

}

最佳答案

read 函数不接收消息,它接收字节。如果你想接收消息,而你确实这样做了,必须编写一个函数来接收它们。这需要遵循 HTTP 协议(protocol)的规则来继续接收字节,直到您拥有完整的消息,无论是一行、整个 header 还是其他任何内容。

“TCP 是一种可靠的字节流协议(protocol),不保留应用程序消息边界”这句话可能已被提及数千次。在您 100% 理解什么是 TCP 之前,不要编写使用 TCP 的代码。它永远不会正常工作。

关于c++ - TCP 服务器 C++/Unix 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com