C# 服务器';如果未检测到换行符但客户端';s插座不是
在设置TCP服务器客户端连接时,我意识到如果客户端不发送“\n”,则服务器接收功能将挂起,但如果服务器不发送,则客户端不会阻止。我试图寻找一个解释,但没有找到正确的答案,所以我来这里寻求你的帮助 我正在使用相同的函数为服务器和客户端交换数据,但我不知道为什么它对其中一个有效,而对另一个无效 这是我在C#中的函数: 套接字是简单的SOCK_流套接字,clientSockets是一个包含客户端对象的列表,其中包含每个客户端信息,包括它们的套接字C# 服务器';如果未检测到换行符但客户端';s插座不是,c#,sockets,C#,Sockets,在设置TCP服务器客户端连接时,我意识到如果客户端不发送“\n”,则服务器接收功能将挂起,但如果服务器不发送,则客户端不会阻止。我试图寻找一个解释,但没有找到正确的答案,所以我来这里寻求你的帮助 我正在使用相同的函数为服务器和客户端交换数据,但我不知道为什么它对其中一个有效,而对另一个无效 这是我在C#中的函数: 套接字是简单的SOCK_流套接字,clientSockets是一个包含客户端对象的列表,其中包含每个客户端信息,包括它们的套接字 我知道一个解决方案是检测一个特定的字符来结束消息,但我
我知道一个解决方案是检测一个特定的字符来结束消息,但我想知道它背后的原因,因为我在使用C时也遇到了这个问题
提前感谢。您的
while
循环只在您读取100字节时才继续,并且您似乎打算使用它来检测消息的结尾
如果消息正好是100字节或任意多个100字节(在这种情况下,它将向其附加后续消息),则此操作将失败
但更糟糕的是,即使数据还在传输中,也不能保证套接字将返回100字节Receive
不会等到基础缓冲区达到100字节,它将返回该点上可用的任何内容
您必须包含一个指示消息长度的标题,或者包含一个指示消息结尾的终止符字符。“我使用C时也遇到了这个问题。”--这不是标记
C
语言的充分理由。您需要显示您的C代码来证明标记的合理性。套接字级别的操作,如read
或recv
与是否接收新行以返回无关。当配置的数据量可用时(通常为1字节,此讨论用于阻止IO),它将返回。@MohithReddy oh好的,我是新发布的问题,谢谢。所以你认为我应该一个字节一个字节地读来避免这个问题?这取决于你想达到什么目的。您希望服务器和客户端的行为如何?@MohithReddy我正在尝试为一个大学项目建立一种聊天室。所以我尝试交换用户名和服务器响应之类的数据,比如“OK”。哦,我没有意识到错误的情况,谢谢!我会设法解决的。
public bool sendToClient(int i, string msg)
{
try
{
(clientSockets.ElementAt(i)).mSocket.Send(Encoding.ASCII.GetBytes(msg));
}
catch(Exception e)
{
Console.WriteLine(e.Data.ToString());
return false;
}
return true;
}
private string getMessageFromConnection(Socket s)
{
byte[] buff;
string msg = "";
int k;
do
{
buff = new byte[100];
k = s.Receive(buff, 100, SocketFlags.None);
msg += Encoding.ASCII.GetString(buff, 0, k);
} while (k >= 100);
return msg;
}