局域网内Socket发送数据丢失后半部分是什么原因造成的,改如何解决?

时间:2021-06-16 00:30:56
d:\1234.txt文本约十几k。
将文件d:\1234.txt里面的内容读取到buffer中,用Socket将buffer发送到服务器端,我客户端和服务器端在一台机器上时则没问题,当把客户端放到同一局域网内其他机器上时接收到的byte数组前半截正确,后半截就全编程0了。这是为什么?丢失数据是因为网络的问题吗?怎样解决?

还有发送数据时一般每次发送多大的byte数组?当我只发送一个1k的文件时又能正确接收。

客户端 发送的代码:

        public void GetFileData()
        {
            FileStream fs = new FileStream(@"d:\1234.txt", FileMode.Open, FileAccess.Read);

            long size = fs.Length;
            byte[] buffer = new byte[size];
            fs.Position = 0;
            fs.Read(buffer, 0, Convert.ToInt32(size));
            fs.Close();

            this.Send(buffer);
        }

        public void Send(byte[] bs)
        {
            try
            {
                int port = 2000;
                string host = "192.168.1.2";
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
                c.Connect(ipe);//连接到服务器
                c.Send(bs, bs.Length, 0);//发送测试信息
                c.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
        }


服务器端 接收的代码:
        public void Receive()
        {
            try
            {
                int port = Int32.Parse(ConfigurationManager.AppSettings["PointTop"].ToString());
                string host = ConfigurationManager.AppSettings["IPTop"].ToString();
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
                s.Bind(ipe);//绑定端口
                s.Listen(0);//开始监听


                IORelated io = new IORelated();
                int size = ThreadCreate.size;
                if (true)
                {
                    Socket temp = s.Accept();//为新建连接创建新的Socket。

                    byte[] recvBytes = new byte[100000000];
                    int bytesNum;//接收到的字节数
                    bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                    temp.Close();
                }
                s.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
                throw;
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
                throw;
            }
        }

11 个解决方案

#1


对了,还有,如果我在接收的这一行 
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
代码上面加个断点,然后调试执行的话又能完整的接收到数据了,测试了很多遍都是这个样子,这是为什么?

#2


一个小时了都,怎么一个回复也没有。。。

#3


超时  丢包。。

发送少的可以发出去吗?

#4


引用 3 楼 wxr0323 的回复:
超时  丢包。。

发送少的可以发出去吗?

少的可以?一般这样的问题都是怎么解决的?

#5


2011年3月24日9:08:53

#6


2011年3月24日10:25:07

#7


缓冲区你给了限制么

#8


你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。

你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。

#9


引用 7 楼 fengyarongaa 的回复:
缓冲区你给了限制么

没有做什么限制,客户端和服务器在一台机器上的时候好使。

#10


引用 8 楼 shinnakoruru 的回复:
你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。

你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。

谢谢谢谢,试了试果真是这个原因。

#11


引用 8 楼 shinnakoruru 的回复:
你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。

你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。

问题解决,结贴给分。

#1


对了,还有,如果我在接收的这一行 
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
代码上面加个断点,然后调试执行的话又能完整的接收到数据了,测试了很多遍都是这个样子,这是为什么?

#2


一个小时了都,怎么一个回复也没有。。。

#3


超时  丢包。。

发送少的可以发出去吗?

#4


引用 3 楼 wxr0323 的回复:
超时  丢包。。

发送少的可以发出去吗?

少的可以?一般这样的问题都是怎么解决的?

#5


2011年3月24日9:08:53

#6


2011年3月24日10:25:07

#7


缓冲区你给了限制么

#8


你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。

你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。

#9


引用 7 楼 fengyarongaa 的回复:
缓冲区你给了限制么

没有做什么限制,客户端和服务器在一台机器上的时候好使。

#10


引用 8 楼 shinnakoruru 的回复:
你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。

你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。

谢谢谢谢,试了试果真是这个原因。

#11


引用 8 楼 shinnakoruru 的回复:
你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。

你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。

问题解决,结贴给分。