DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TCPとデスクトップ描写

環境/言語:[Visual Studio 2010 Express C#]
分類:[.NET]

いつも、こちらのサイト様を利用させて頂いているものです。
C#でTCPを用いたプログラミングで躓いています。

TCPclientで得た座標を元に、リモート先で直線を引きたく、コーディングいたしました。
しかし、1回目は成功するものの、2回目以降のデータの処理がされません。(try文でnot validなどと返されてしまいます。)

どう変更すればよろしいのでしょうか?

/////

//Startボタン
private void button1_Click_1(object sender, EventArgs e)
{
try
{
ip = "x.x.x.x";
port = 2000;
client = new TcpClient(ip, port);
stream = client.GetStream();

byte[] tmp = ImageToByteArray(image1);
stream.Write(tmp, 0, tmp.Length);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}

try
{
//while (true)
//{
ip2 = IPAddress.Any;
port2 = 9000;
server2 = new TcpListener(ip2, port2);
server2.Start();

System.IntPtr DesktopHandle = GetDC(System.IntPtr.Zero);
Graphics g2 = System.Drawing.Graphics.FromHdc(DesktopHandle);

System.Drawing.Pen myPen;
myPen = new System.Drawing.Pen(System.Drawing.Color.Red, 4);
while(true) {
client2 = server2.AcceptTcpClient();
NetworkStream stream2 = client2.GetStream();
byte[] getData = new byte[1024 * 1024 * 10];
int count = stream2.Read(getData, 0, getData.Length);

if (count != 0)
{
IPEndPoint endpoint = (IPEndPoint)client.Client.RemoteEndPoint;
IPAddress address = endpoint.Address;

Byte[] getByte = new byte[count];
for (int i = 0; i < count; i++)
{
getByte[i] = getData[i];
}

string data = Encoding.UTF8.GetString(getByte);
//MessageBox.Show(data);
string[] sdata = data.Split('&');
string[] sdata1 = sdata[0].Split('+');
string[] sdata2 = sdata[1].Split('+');
g2.DrawLine(myPen, int.Parse(sdata1[0]), int.Parse(sdata1[1]), int.Parse(sdata2[0]), int.Parse(sdata2[1]));

myPen.Dispose();


stream2.Close();
client2.Close();
}
g2.Dispose();
} //End of while(1)
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}
■No32191に返信(NSさんの記事)
> しかし、1回目は成功するものの、2回目以降のデータの処理がされません。(try文でnot validなどと返されてしまいます。)
>
> どう変更すればよろしいのでしょうか?

こういう場合には、例外が発生している場所を特定することが
原因追及の早道になります。
ステップ実行で場所を特定してください。

ざっとソースを見ると
MyPenとg2のDisposeを行うタイミングが
おかしいように感じました。
再考してみては如何でしょうか。
早速のご回答ありがとうございます。
ステップイン実行しましたが、エラーが起こる事なくForm1が起動しました。

> MyPenとg2のDisposeを行うタイミングが
> おかしいように感じました。
> 再考してみては如何でしょうか。
ご指摘の箇所ですが、myPen・g2.Disposeをwhileの実行後にすると何故か「そのような宣言はありません」といったエラーが起こりデバッグ出来ません。
焦っていました。申し訳ありません。

///
} //End of while(1)
myPen.Dispose();
g2.Dispose();
///
のように変更した所、うまくいきました。(理由はあいまいですが・・・TT;)

心より感謝申し上げます。
また何か困った際はよろしくお願い致します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板