在c++ . net中使用套接字时无法获得响应

Cannot get response when using socket in C++.NET

本文关键字:响应 套接字 net c++      更新时间:2023-10-16

我写了两个程序,一个作为服务器,另一个作为客户端。服务器是使用WinSock2.h用标准c++编写的。它是一个简单的echo服务器,这意味着服务器将它接收到的内容响应回客户端。我为每个客户端连接使用了一个新线程,并且在每个线程中:

Socket* s = (Socket*) a;
while (1) {
  std::string r = s->ReceiveLine()
  if (r.empty()) {
    break;
  }
  s->SendLine(r);
}
delete s;
return 0;

Socket是这里的一个类。服务器运行正常,我已经使用telnet测试了它,它工作得很好。

然后我用c++编写客户端。. NET(或c++/CLI), TcpClient用于发送和接收来自服务器的消息。代码如下:

String^ request = "test";
TcpClient ^ client = gcnew TcpClient(server, port);
array<Byte> ^ data = Encoding::ASCII->GetBytes(request);
NetworkStream ^ stream = client->GetStream();
stream->Write(data, 0, data->Length);
data = gcnew array<Byte>(256);
String ^ response = String::Empty;
int bytes = stream->Read(data, 0, data->Length);
response = Encoding::ASCII->GetString(data, 0, bytes);
client->Close();

当我运行客户机并尝试在表单上显示响应消息时,程序在int bytes = stream->Read(data, 0, data->Length);行处停止并且无法获取响应。服务器正在运行,与网络无关,因为它们都在同一台计算机上运行。

我猜原因是数据服务器响应小于data->Length,所以Read方法正在等待更多的数据。对吗?我该如何解决这个问题?

<标题>编辑我想我已经解决了这个问题……Socket类中还有另外两个方法,ReceiveBytesSendBytes,这两个方法不会删除字节数组中未使用的空间。因此,从服务器返回的数据长度将与从客户端返回的数据长度匹配,因此Read方法将不会等待更多数据的到来。
std::string Socket::ReceiveLine() {
std::string ret;
while (1) {
char r;
switch(recv(s_, &r, 1, 0)) {
  case 0: // not connected anymore;
          // ... but last line sent
          // might not end in n,
          // so return ret anyway.
    return ret;
  case -1:
    return "";
//      if (errno == EAGAIN) {
//        return ret;
//      } else {
//      // not connected anymore
//      return "";
//      }
}
    ret += r;
    if (r == 'n')  return ret;
  }
}

我猜服务器的接收函数正在等待输入键'n'。

试试"testn" string.

String^ request = "testn";
// other codes....