无法通过TCP套接字

时间:2017-02-09 10:07:34

标签: c# android .net sockets xamarin

我正在尝试从android(客户端)向Linux(服务器)发送一个字节数组,我可以发送大约17kB但是套接字发送客户端套接字超时异常。在服务器端,我使用netcat和下一个命令:

nc -l -p 55000 > out.txt

这样可行,因为我能够从其他计算机发送文件,因此我认为问题出在客户端(Android)。

我正在使用Visual Studio 2015和Xamarin来编译项目,我尝试了很多方法来发送具有相同结果的思想套接字,介于15~20kB之间。当然Android上通过互联网发送的权限和其他权利都可以。

这是我尝试的第一种模式:

byte[] data = new byte[200000];
TcpClient client = new TcpClient("192.168.0.245", 55000);
client.SendBufferSize = 8192;
NetworkStream ns = client.GetStream();
ns.ReadTimeout = 1000;
ns.WriteTimeout = 1000;
ns.Write(data, 0, data.Length);
ns.Flush();
ns.Close();
client.Close();

使用此方法只接收大约17kB且套接字未关闭,但执行close方法(我使用调试器测试它,将MessageBox置于发布中进行测试)。

我测试的其他方法是:

IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.0.245"), 55000);
System.Net.Sockets.Socket sender = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

sender.ExclusiveAddressUse = true;
sender.LingerState = new LingerOption(true, 1);
sender.NoDelay = true;
sender.SendBufferSize = 8192;
sender.ReceiveBufferSize = 8192;
sender.SendTimeout = 1000;
sender.ReceiveTimeout = 1000;
sender.Ttl = 42;

try{
byte[] data = new byte[200000];
    sender.Connect(remoteEP);
    for (int a = 0; a < data.Length;)
    {
        int len = (data.Length - a) > 8192 ? 8192 : data.Length - a;
        a += sender.Send(data, a, len, SocketFlags.None);
    }
}
catch (Exception e)
{
     string a = e.ToString();
}

程序发送前8192个字节,在第二轮中,套接字超时异常被抛出。如果我尝试发送所有字节是一次程序执行send方法,则返回的字节是数组的总长度,这意味着所有字节都被发送到套接字但只接收到17kB。

我已经测试过其他方法在两部手机中使用相同的结果做同样的事情。我正在使用的编译器的android版本是4.2。对于VS和Xamarin来说是最新的。

此外,我尝试从市场上下载一个应用程序,通过TCP发送文件,看看问题是在Netcat,防火墙,SO还是其他的,文件被发送好了....我觉得非常沮丧,我想我做得很好。

提前致谢

0 个答案:

没有答案