gpt4 book ai didi

c++ cin >> 套接字样式函数

转载 作者:行者123 更新时间:2023-11-30 00:35:31 25 4
gpt4 key购买 nike

我目前正在开发一个套接字程序。

是否可以像下面的用例那样使用流插入运算符?

__sin >> var; // similar to cin >> var;

函数体是这样的

var = remoteConsole.getline();

所以当我在远程位置使用我的远程控制台时,我可以使用该函数代替 cin我知道我可以使用类似的东西

cin.getLine()var=remoteConsole.cin()

但我正在努力避免这种情况。

我开始认为我尝试做的事情是不可能的,尽管它看起来很容易,我可能不得不放弃这个想法。我环顾四周,但我尝试的一切都充满了编译错误。任何帮助,将不胜感激。谢谢

编辑

对于那些不清楚我在说什么的人(我试图清楚地解释)我试图用与 cin 相同的语法创建一个函数,而不是从控制台获取输入,而是从某个地方获取它否则,即 socket 。我在创建一个使用 << 或 >> 而不是 ( 和 ) 的函数时遇到了问题。我希望语法与 cin >> 和 cout << 相同。我的问题应该是,我应该从哪里开始做这件事?

我找到了一种方法,但我不确定它的安全性。我创建了两个结构并在一个中重载了 <<,在另一个中重载了 >>

struct out_t {
template<typename T>
out_t& operator << (T&& x) {
// Send x to the socket
// Use console for now
cout << x;
return *this;
}
};

out_t socout;

struct in_t {
template<typename T>
in_t& operator >> (T&& x) {
// get x from the socket and wait untill done so;
// Use console for now
cin >> x;
return *this;
}
};

in_t socin;

现在我可以使用了

socout << "Some message"; // which i can now send to an external console
socin >> strValue;// i can request the data needed from external program/computer

抱歉,如果我一开始没有很好地解释这一点。可能有改进的余地,但我对此很满意。如果这不是要走的路,请有人告诉我正确的方法。

谢谢大家;

最佳答案

如果您想做的只是创建一个 std::istream& 从套接字而不是预定义流之一读取,您可以创建自定义 std::streambuf:std::istream 并不真正进行任何字符读取。这是流缓冲区的工作。 std::istream 所做的只是提供一个接口(interface)来重载输入操作、保存格式标志、错误指示器和流缓冲区。

要为输入字符创建自定义流缓冲区,您需要覆盖 underflow() 以将字符读入缓冲区,例如,类似这样的操作(使用典型的 UNIX API for sockets;在不同的系统只是访问套接字的代码确实不同):

class socketbuf: public std::streambuf {
typedef std::streambuf::traits_type traits_type;
int d_fd;
char d_buffer[2000];
int underflow() {
if (this->gptr() == this->egptr()) {
std::streamsize size = ::read(this->d_fd, this->d_buffer, sizeof(this->d_buffer));
this->setg(this->d_buffer, this->d_buffer, this->d_buffer + size);
}
return this->gptr() == this->egptr()
? traits_type::eof()
: traits_type::to_int_type(*this->gptr());
}
public:
socketbuf(int fd): d_fd(fd) {}
};

一旦你有了这样的流缓冲区,你就可以用指向这个流缓冲区的指针初始化一个 std::istream 。如果您计划多次使用此设置,您可能需要创建一个自定义 isocketstream 类,它创建流缓冲区并设置一个 std::istream结果。这里只是解包使用:

int fd = get_and_setup_socket(); // get a file descriptor for the socket somehow
socketbuf sbuf(fd);
std::istream sin(&sbuf);

std::istream& in(use_local? std::cin: sin);
if (in >> whatever) {
std::cout << "received '" << whatever << "'\n";
}

您可能希望用输出操作来补充输入操作。为此,您还需要重写函数 overflow()sync(),前者在设置缓冲区溢出时调用,后者在流被刷新时调用。

关于c++ cin >> 套接字样式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818641/

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