Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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#套接字时的奇怪行为_C#_Sockets - Fatal编程技术网

发送字符串C#套接字时的奇怪行为

发送字符串C#套接字时的奇怪行为,c#,sockets,C#,Sockets,我有一个带有套接字的客户机-服务器应用程序。它还没有优化,但这不是问题所在。每当我发送像“Test”这样的字符串时,另一端会收到“T\0\0\0”,因此只有字符串的第一个字母和数组的其余部分(保存它的位置)会用0填充。我试着改变各种价值观,但似乎不明白为什么会这样。奇怪的是,在我发送字符串之前,它仍然是整个字符串,但一旦它收到了第一个字母。有人能帮我吗 m_workerSocket[1].Send(byData); 发送 public void sendData(Socket sendingS

我有一个带有
套接字的客户机-服务器应用程序。它还没有优化,但这不是问题所在。每当我发送像“Test”这样的
字符串时,另一端会收到“T\0\0\0”,因此只有
字符串的第一个字母和数组的其余部分(保存它的位置)会用0填充。我试着改变各种价值观,但似乎不明白为什么会这样。奇怪的是,在我发送字符串之前,它仍然是整个
字符串
,但一旦它收到了第一个字母。有人能帮我吗

m_workerSocket[1].Send(byData);
发送

public void sendData(Socket sendingSocket, String message)
{
    if (sendingSocket == m_workerSocket[0])
    {
        byte[] byData = System.Text.Encoding.ASCII.GetBytes(message);
        m_workerSocket[1].Send(byData);

    }
}
m_workerSocket[1].Send(byData);
接收

public void OnDataReceived(IAsyncResult asyn)
{
    try
    {
        SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
        int iRx = theSockId.thisSocket.EndReceive(asyn);
        char[] chars = new char[iRx + 15]; //Added this to force the array length for test purposes
         Decoder d = Encoding.UTF8.GetDecoder();
        int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
        //int bytesRead = nwStream.Read(theSockId.dataBuffer, 0, client.ReceiveBufferSize);
        String szData = new String(chars);

        Console.WriteLine(szData);
}
m_workerSocket[1].Send(byData);
编辑===============================================
在发送部分,如果我制动点

m_workerSocket[1].Send(byData);

byData包含整个字符串。因此它与接收端有关,但我不知道
iRx的值是多少?如果为1,则只读取第一个字母
iRx
charLen
都会指示已接收的字节数/字符数。它们有什么价值?我猜是1。我猜(你没有说过)你说的是TCP,而不是UDP(都使用套接字)。在这种情况下,传输给您的只是“字节流”。如果您想要消息传递,则由您自己来实现,或者您应该转移到更高级别的抽象来实现它。无法保证一侧的
Send
调用与另一侧的
Receive
调用1-1匹配。为什么在发送时使用Encoding.Ascii,在接收时使用Encoding.UTF8?此外,您可以从Encoding.Ascii.GetString获得字符串。“如果我将字符声明行作为断点,那么它将是一个带有16的数组”,如果您是指这一行:
char[]chars=new char[iRx+15]那么很明显,您只收到1份电传给我们。
iRx
的价值是多少?如果为1,则只读取第一个字母
iRx
charLen
都会指示已接收的字节数/字符数。它们有什么价值?我猜是1。我猜(你没有说过)你说的是TCP,而不是UDP(都使用套接字)。在这种情况下,传输给您的只是“字节流”。如果您想要消息传递,则由您自己来实现,或者您应该转移到更高级别的抽象来实现它。无法保证一侧的
Send
调用与另一侧的
Receive
调用1-1匹配。为什么在发送时使用Encoding.Ascii,在接收时使用Encoding.UTF8?此外,您可以从Encoding.Ascii.GetString获得字符串。“如果我将字符声明行作为断点,那么它将是一个带有16的数组”,如果您是指这一行:
char[]chars=new char[iRx+15]m_workerSocket[1].Send(byData);