从服务器向客户端发送数据包的速度不够快(包含代码)

时间:2011-07-13 09:23:44

标签: c# sockets networking video udp

我正在用C#编写视频会议应用程序,我遇到了一些视频延迟问题,

客户端将从网络摄像头拍摄图像,每秒10帧,然后使用TCP(很快将转换为UDP)将它们一个接一个地发送到服务器。我使用Socket.Send,套接字是Blocking。         `

if (VideoSoc != null)
{
    try
    {
        VideoSoc.SendBufferSize = picChunk.Length;
        VideoSoc.Send(picChunk);
        sendimage++;
    }
    catch (SocketException expp)
    {
        if (expp.ErrorCode == 10054)
        {
            //ConnectSockets();
            //MessageBox.Show("Video has been disconnected.");
        }
    }
    catch (Exception exppp) { }
}
服务器上的

有一个Room类和一个User类,每个连接到它的User都会有一个byte []类型的Queue来存储这个用户收到的图像。

List<byte> bl = new List<byte>(VideoPacket.Videobuffer);
bl.RemoveRange(iRx, VideoPacket.Videobuffer.Length - iRx);
byte[] nb = new byte[bl.Count];
bl.CopyTo(nb);
Rooms[VideoPacket.Index].UsersList[VideoPacket.Pos].VideoList.Enqueue(nb);

然后在While(true)循环中,在与主线程不同的线程上,服务器将遍历用户列表,获取存储在队列中的映像,并使用udp套接字将其发送到所有其他连接的客户端。

while (true)
{
    try
    {
        for (int x = 0; x < Rooms[roomindex].UsersList.Count; x++)
        {
            try
            {
                // this is my temp solution to eliminate the delay.. if more than 10 frames are stacked up in the ques.. clear them, which will effect the smoothness of the video on the client side
                if (Rooms[roomindex].UsersList[x].VideoList.Count >10)
                {
                    Rooms[roomindex].UsersList[x].VideoList.Clear();
                }
                countt = Rooms[roomindex].UsersList[x].VideoList.Count;

                if (Rooms[roomindex].UsersList[x].VideoList.Count > 0)
                {
                    byte[] videodata = Rooms[roomindex].UsersList[x].VideoList.Dequeue();

                    for (int i = 0; i < Rooms[roomindex].UsersList.Count; i++)
                    {
                        if (i != x && Rooms[roomindex].UsersList[i].Username != "u" && Rooms[roomindex].UsersList[i].Ready)
                        {
                            try
                            {
                                Rooms[roomindex].UsersList[i].udpvideosocket.SendTo(videodata, Rooms[roomindex].UsersList[i].ep);
                            }
                            catch(Exception ex) { }
                        }
                    }
                }
            }
            catch (Exception exo)
            {
                Rooms[roomindex].UsersList[x].VideoList.Clear();
            }
        }
    }
    catch (Exception VideoSendingException)
    {
         logerror(VideoSendingException);
    }

在这里我可以看到,当新客户端连接时越来越多,每个用户视频队列数量都在增加,这导致了upd socket.send不足以将数据发送到20个连接的客户端的结论。那是我的问题。

我不是套接字专家,我尽力使用知识谷歌搜索结果提供了一个大人物。而且我知道我的代码并不是最好的,并且没有进行优化,因此欢迎任何建议或指向正确的方向。 请随时要求澄清。

谢谢。

由于UDP在NAT路由器后面遇到困难,我回到使用TCP。

1 个答案:

答案 0 :(得分:1)

来自MSDN Socket.SendTo

If you are using a connectionless protocol in blocking mode, SendTo will block until the datagram is sent.

据我所知,这正是你正在做的事情。