在c++ . net中使用套接字时无法获得响应
Cannot get response when using socket in C++.NET
我写了两个程序,一个作为服务器,另一个作为客户端。服务器是使用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
类中还有另外两个方法,ReceiveBytes
和SendBytes
,这两个方法不会删除字节数组中未使用的空间。因此,从服务器返回的数据长度将与从客户端返回的数据长度匹配,因此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....
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 使用RAW套接字读取ICMP响应
- 使用套接字 SFML 时窗口无响应
- 使用套接字编程的怪异HTTP响应
- 通过套接字正确发送 HTTP 响应
- 无法使用原始套接字打印 TCP 响应
- 如何获取套接字的响应
- 通过原始套接字接收"syn"数据包时,如何使用"syn ack"数据包进行响应?
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- 在连接的套接字上进行UDP响应
- 套接字编程中的多个请求/响应
- 在c++ . net中使用套接字时无法获得响应
- 在winsock中制作了一个c++套接字,并连接到谷歌,我在响应结束时得到了一些垃圾