繁体   English   中英

c#从socket重新读取

[英]c# reread from socket

我试图第一次从套接字读取,然后中止处理它的线程然后重新读取。 这里奇怪的部分是有时它有效,有时则不然。

客户:

private void startSend() 
{
    Image f;
    ms = new MemoryStream();
    while (true) 
    {
        f = GetDesktopImage();
        f.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        bmpBytes = (ms.ToArray());
        SendVarData(client.Client, bmpBytes);
        count++;
        ms.SetLength(0);
    }
}

private int SendVarData(Socket s, byte[] data) 
{
    total = 0;
    int size = data.Length;
    int dataleft = size;
    int sent;

    datasize = BitConverter.GetBytes(size);
    sent = s.Send(datasize);

    while (total < size) 
    {
        sent = s.Send(data, total, dataleft, SocketFlags.None);
        total += sent;
        dataleft -= sent;
    }
    return total;
}

我在一个始终在后台运行的线程中调用start发送。

服务器代码:

MemoryStream ms;
byte[] data;
public void startListening() 
{
    while (true) 
    {
        try 
        {
            data = ReceiveVarData(client.Client);
            ms = new MemoryStream(data);
            theImage.Image = Image.FromStream(ms);
            count++;
        } catch {}
    }
}

private static byte[] ReceiveVarData(Socket s) 
{
    int total = 0;
    int recv;
    byte[] datasize = new byte[4];

    recv = s.Receive(datasize, 0, 4, 0);
    int size = BitConverter.ToInt32(datasize, 0);
    int dataleft = size;
    byte[] data = new byte[size];

    while (total < size) 
    {
        recv = s.Receive(data, total, dataleft, 0);
        if (recv == 0) break;
        total += recv;
        dataleft -= recv;
    }
    return data;
}

它像我第一次说的那样工作得很好,但是当我试图关闭第二个表格上的线程时

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    th.Abort();
}

并尝试再次阅读我只是在这一行得到一个错误

byte [] data = new byte [size];

错误:

算术运算导致溢出

试图打印size值,它像-2522561418 ...

当然我在表单开头再次重新启动线程

th= new Thread(new ThreadStart(startListening));
th.Start();

您无法从已读取的套接字“重读”数据。 为什么你认为这是可能的? 我不明白它背后的思路。

Thread.Abort是邪恶的 ,不能使用。 只要您的代码包含对该方法的调用,您的代码就会无效并且必须更改。

无论如何, Abort无法中止IO。 中止可以在网络读取之前或之后发生。 我想这可以解释为什么有时“重读”有效 - 因为之前没有读过数据。

可能你应该在连接期间运行一个线程。 该线程应该读取所​​有内容并将其放入数据结构中以供以后检索。 例如, Queue<Image>

事实上,我强烈建议您删除所有这些套接字代码并使用WCF或HTTP。 这些协议为您处理了很多细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM