server
codice:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Data;
using System.Linq;
using System.ComponentModel;
namespace SCVAnalyzerWin3Server
{
public class AsynchNetworkServer
{
public int[] temp_id;
public int[] dep_id;
public int[] qual_id;
class ClientHandler
{
int var;
private byte[] bw2;
private byte[] buffer;
private Socket socket;
private NetworkStream networkStream;
private AsyncCallback callbackRead;
private AsyncCallback callbackWrite;
public ClientHandler(Socket socketForClient)
{
var = 2000000;
socket = socketForClient;
buffer = new byte[256];
bw2 = new byte[var];
networkStream = new NetworkStream(socketForClient);
callbackRead = new AsyncCallback(this.OnReadComplete);
callbackWrite = new AsyncCallback(this.OnWriteComplete);
}
public void StartRead()
{
networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, null);
}
private void OnReadComplete(IAsyncResult ar)
{
int bytesRead = networkStream.EndRead(ar);
if (bytesRead > 0)
{
Console.Write("Received {0} bytes from client: {1} {2} {3} {4} ", bytesRead, buffer[0], buffer[1], buffer[2], buffer[3]);
if (buffer[0] == 0)
{
int dependency = buffer[1];
int quality = buffer[2];
int temporal = buffer[3];
using (BinaryReader b = new BinaryReader(File.Open("out.bin", FileMode.Open)))
{
int pos = 0, j = 0;
int length = (int)b.BaseStream.Length;
byte bytes_char;
while (pos < length && j <= 606)
{
bytes_char = b.ReadByte();
if (riassunto[j].tipo == 14 || riassunto[j].tipo == 20)
{
if (riassunto[j].dependency <= dependency && riassunto[j].temporal <= quality && riassunto[j].quality <= quality)
{
bw.Write(bytes_char);
}
}
else
{
bw.Write(bytes_char);
}
pos += sizeof(byte);
if (riassunto[j + 1].posizione == pos)
j++;
}
}
}
else
{
bw.Flush();
int priority = buffer[1];
using (BinaryReader b = new BinaryReader(File.Open("out.bin", FileMode.Open)))
{
int pos = 0, j = 0;
int length = (int)b.BaseStream.Length;
byte bytes_char;
while (pos < length && j <= 606)
{
bytes_char = b.ReadByte();
if (riassunto[j].tipo == 14 || riassunto[j].tipo == 20)
{
if (riassunto[j].priority <= priority)
{
bw.Write(bytes_char);
}
}
else
{
bw.Write(bytes_char);
}
pos += sizeof(byte);
if (riassunto[j + 1].posizione == pos)
j++;
}
}
}
}
else
{
Console.WriteLine("Read connection dropped");
networkStream.Close();
networkStream = null;
socket = null;
}
}
private void OnWriteComplete(IAsyncResult ar)
{
networkStream.EndWrite(ar);
Console.WriteLine("Write complete");
networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, null);
}
}
public static void Main()
{
using (BinaryReader bQuality = new BinaryReader(File.Open("out.bin", FileMode.Open)))
{
GetNALUQuality(bQuality);
}
AsynchNetworkServer app = new AsynchNetworkServer();
app.Run();
}
private void Run()
{
IPAddress localAddr = IPAddress.Parse("192.168.1.9");
TcpListener tcpListener = new TcpListener(localAddr, 10000);
tcpListener.Start();
for (; ; )
{
Socket socketForClient = tcpListener.AcceptSocket();
Console.WriteLine("Client connected");
ClientHandler handler = new ClientHandler(socketForClient);
handler.StartRead();
}
}
static BinaryWriter bw = new BinaryWriter(File.Create("out2.bin"));
static NALU[] riassunto = new NALU[608];
public struct NALU
{
public int posizione;
public int tipo;
public int quality;
public int dependency;
public int temporal;
public int priority;
}
private static void GetNALUQuality(BinaryReader bQuality)
{
int pos = 0, field;
int length = (int)bQuality.BaseStream.Length;
byte[] bytes_chars = new byte[3];
int j = 0;
while (pos < (length - 2) && j <= 607)
{
bytes_chars = bQuality.ReadBytes(3);
field = ((bytes_chars[0] << 16) | (bytes_chars[1] << 8) | (bytes_chars[2])) & 0xffffff;
if (field == 1)
{
riassunto[j].posizione = pos;
int byteread = bQuality.ReadByte();
riassunto[j].tipo = byteread & 0x1F;
byteread = bQuality.ReadByte();
int mask = 0x3f;
riassunto[j].priority = byteread & mask;
byteread = bQuality.ReadByte();
mask = 0x70;
riassunto[j].dependency = (byteread & mask) >> 4;
mask = 0x0f;
riassunto[j].quality = byteread & mask;
byteread = bQuality.ReadByte();
mask = 0xe0;
riassunto[j].temporal = (byteread & mask) >> 5;
j++;
bQuality.BaseStream.Position -= 4;
}
bQuality.BaseStream.Position -= 2;
pos += sizeof(byte);
}
}
private static int GetNALUType(BinaryReader b)
{
int type = b.ReadByte();
int mask = 0x1f;
return type & mask;
}
private void DecodeSVCHeaderExt(BinaryReader b)
{
int byteread = b.ReadByte();
int mask = 0x3f;
int priority_id = byteread & mask;
byteread = b.ReadByte();
mask = 0x70;
int dependency_id = (byteread & mask) >> 4;
mask = 0x0f;
int quality_id = byteread & mask;
byteread = b.ReadByte();
mask = 0xe0;
int temporal_id = (byteread & mask) >> 5;
temp_id[temporal_id]++;
dep_id[dependency_id]++;
qual_id[quality_id]++;
}
}
}
In particolare a console non viene stampata la scritta di avvenuta scrittura dal server al client ed il programma si impalla. Grazie.