Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务器';如果未检测到换行符但客户端';s插座不是_C#_Sockets - Fatal编程技术网

C# 服务器';如果未检测到换行符但客户端';s插座不是

C# 服务器';如果未检测到换行符但客户端';s插座不是,c#,sockets,C#,Sockets,在设置TCP服务器客户端连接时,我意识到如果客户端不发送“\n”,则服务器接收功能将挂起,但如果服务器不发送,则客户端不会阻止。我试图寻找一个解释,但没有找到正确的答案,所以我来这里寻求你的帮助 我正在使用相同的函数为服务器和客户端交换数据,但我不知道为什么它对其中一个有效,而对另一个无效 这是我在C#中的函数: 套接字是简单的SOCK_流套接字,clientSockets是一个包含客户端对象的列表,其中包含每个客户端信息,包括它们的套接字 我知道一个解决方案是检测一个特定的字符来结束消息,但我

在设置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;
}