c++:在无限循环函数中初始化if语句之外使套接字对象可见



在c++/omnet++中的一个无穷循环函数中,我尝试初始化一个套接字对象'sock',然后我想在我的无穷循环中检索传入的数据。这在普通的c++代码中当然很容易…但是我们是在omnet++环境中我不能初始化然后在main函数中运行一个无穷循环。我只有一个无限循环&;network_func_;问题是编译器说"'sock'没有在这个作用域中声明。当我想调用它的时候在上述的无限循环中初始化if语句之外的函数

(int bytesReceived = recv(sock,buf,4096,0);).

下面是我的代码:

void VeinsInetSampleApplication::Network_func()
{
static bool runOnlyOnce = false;
if (!runOnlyOnce) {
string ipAddress = "127.0.0.1";  //IP Address of the server
int port = 59006;                //Listening port # on the server
//Initialize WinSock
WSAData data;
WORD ver = MAKEWORD(2, 2);
int wsResult = WSAStartup(ver, &data);
if (wsResult != 0)
{
cerr << "Can't start winsock, Err #" << wsResult << endl;
//return 0;
}
//Create Socket
SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
WSACleanup();
}
// Fill in a hint structure
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
//inet_pton(AF_INET, ipAddress.c_str(), &hint.sin_addr);
hint.sin_addr.s_addr = inet_addr("127.0.0.1");
// Connect to server
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
if (connResult == SOCKET_ERROR)
{
cerr << "Can't connect to server, Err #" << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
}
runOnlyOnce = true;
}

//Do-while loop to send and receive data
char buf[4096];
string userInput;
ZeroMemory(buf, 4096);
int bytesReceived = recv(sock,buf,4096,0);
if (bytesReceived > 0)
{
//...do something with received data...
}

}

限制似乎是我无法访问omnet++中的main函数,因为它是oppenvir库的一部分(参见:omnet++中的main函数),因此我认为分离套接字初始化,然后运行某种无休止的循环进行数据处理是行不通的。如果有人是omnet++的专家,请纠正我,但我认为一切都必须在我的无穷循环函数中处理。

总结:是否有可能使'sock'对整个函数可用?(当然,我知道如果不调用if语句,就不会声明'sock',但这种情况不会发生。如果我没有在If语句中连接,我当然会得到错误信息"不能连接">

veins_inet/VeinsInetSampleApplication。Cc:136:32:错误:'sock'未在此范围内声明int bytesReceived = recv(sock,buf,4096,0);

编辑:一些背景:阅读问题时可能会感到困惑。omnet++是一个在Eclipse中设置的网络模拟器。我的代码片段不会在网络模拟器中建立TCP连接,而是提供一个"live"。连接到外部TCP服务器。总之,我想从网络模拟器内部连接到外部世界。

首先,不能在任何omnet++方法中创建无限循环。它违背了omnet++的工作原理。无限循环阻止处理事件。
第二,如果你的意图是通过真正的网络接口从一个简单的模块发送消息,我建议看看网络仿真。

最新更新