首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux下C++网络编程:服务器问题

linux下C++网络编程:服务器问题
EN

Stack Overflow用户
提问于 2010-10-13 21:56:47
回答 2查看 442关注 0票数 1

我正在学习如何使用c/c++进行网络编程,并且我已经创建了一个服务器(TCP),它应该以特定的方式响应来自客户端的消息。为了做到这一点,我创建了一个类,服务器类将消息传递给它,并返回一个字符串报告给客户端。

这就是我的问题,如果只是重复我发送给消息处理程序的内容,有时它会返回正确的字符串。在代码中的任何地方,我都没有让它返回传入的内容。所以我想知道我是否正确地处理了得到的消息?

其次,我不确定如何在while循环中保持连接打开,以便不断来回传递消息。你可以在下面的代码中看到我是如何做到这一点的,但我非常确定这是不正确的,任何关于这方面的帮助都会很好。谢谢!

代码语言:javascript
复制
if (!fork())
    { // this is the child process
        close(sockfd); // child doesn't need the listener

        while ((numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0)) > 0)
        {
            //numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0);

            buf[numbytes-1] = '\0';
            const char* temp = ash.handleMessage(buf).c_str();
            int size_of_temp = ash.handleMessage(buf).length();
            send(new_fd, temp, size_of_temp, 0);

            //send(new_fd, temp, size_of_temp+1, 0);
        }
    }//end if

请原谅我的黑人区代码

Handles the message

Class Method handler uses

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-14 00:11:20

您正在调用handleMessage两次。您没有发布代码,但看起来您将返回一个string。这样做可能更好:

代码语言:javascript
复制
        string temp = ash.handleMessage(buf);
        int size_of_temp = temp.length();

这将避免重复在handleMessage中发生的任何操作。

票数 1
EN

Stack Overflow用户

发布于 2010-10-13 22:12:33

如果你学习套接字,你也应该知道,你不能假设你发送的()作为一个“完整的消息”,将作为一个完整的消息来传递。

如果您从客户端发送()一些大数据,您可能需要在服务器上使用多个recv() (反之亦然)来读取所有数据。这与文件通常的工作方式有很大的不同……

如果你正在设计你自己的协议,你也可以选择发送消息的长度,比如LEN。一个简单的例子是,如果您发送的字符串被限制为256个字节,您可以从send ()开始,发送一个代表字符串长度的短值。

或者更简单,决定使用换行符(newline - \n)来终止消息。协议看起来会像这样

“消息1\nmsg2\n”

然后,您必须使用recv(),并追加数据,直到得到换行符。这就是我现在所能收集到的全部,在互联网上有很多很好的例子,但我建议你获取一些“真正”程序的源代码,看看它是如何处理它的网络的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3924459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档