討論區快速選單
知識庫快速選單
網路投保旅行平安險 討論區最近新進100則主題 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
Server Socket __Windows Form in VC++ .NET
更改我的閱讀文章字型大小
作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/24 下午 06:09:53
請教一下,我的 Server 端Socket 的Windows Form程式,當按下監聽(button1_Click)時,
會建立及設定相關的socket程序,並將接收到的資料(Data),顯示在textBox1裡。

但有一個問題時,當按下button1_Click,程序執行到 clientSocket = serverSocket->Accept(); 後。
程式就會hand住(一直等待)。此時也無法做其它的動作(無法點其它button)。

請問是否我的做法哪裡有問題?




//Form1.h

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

serverSocket = gcnew Socket (AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
IPAddress^ serverIP = IPAddress::Parse("127.0.0.1");
IPEndPoint^ serverhost = gcnew IPEndPoint(serverIP, Int32::Parse("8888"));
serverSocket->Bind(serverhost);
serverSocket->Listen(Int32::MaxValue);

clientSocket = serverSocket->Accept(); // 這個步驟以下,會造成程式的等待 (han住不動)

array<Byte>^ bytes = gcnew array<Byte> (2048);
int bytesReceived = clientSocket-> Receive(bytes, 0, bytes->Length, SocketFlags::None);
textBox1->Text = Encoding::UTF8-> GetString(bytes, 0, bytesReceived);

...................

}
作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/26 下午 03:45:04
請問,是我的問題不明確? 還是什麼原因?
怎麼沒有前輩願意提供些意見@@?

難道真的很少人用VC++ .NET 寫 Windows Form Socket嗎?

如果我找到方法,仍沒人回應,再來跟大家分享好了~~~~
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4466 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/26 下午 04:03:29


>但有一個問題時,當按下button1_Click,程序執行到 clientSocket = serverSocket->Accept(); 後。
>程式就會hand住(一直等待)。此時也無法做其它的動作(無法點其它button)。
>
>請問是否我的做法哪裡有問題?
>
>
>
>
>//Form1.h
>
>private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
>
>serverSocket = gcnew Socket (AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
>IPAddress^ serverIP = IPAddress::Parse('127.0.0.1');
>IPEndPoint^ serverhost = gcnew IPEndPoint(serverIP, Int32::Parse('8888'));
>serverSocket->Bind(serverhost);
>serverSocket->Listen(Int32::MaxValue);
>
>
try {
 
clientSocket = serverSocket->Accept(); // 這個步驟以下,會造成程式的等待 (han住不動)

}
catch ( /* put exception type for catching )
{
    /* exception handling for this kind */
}
catch ( /* put exception type for catching )
{
   /* exception handling for this kind */
}
catch ( /* put exception type for catching )
{
   /* exception handling for this kind */
}
catch (...)
{
    /* handle those exceptions that don't belong to the above */
}

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept(v=vs.71).aspx

please refer to the above link for more information about socket exception



>
>array<Byte>^ bytes = gcnew array<Byte> (2048);
>int bytesReceived = clientSocket-> Receive(bytes, 0, bytes->Length, SocketFlags::None);
>textBox1->Text = Encoding::UTF8-> GetString(bytes, 0, bytesReceived);
>
>...................
>
>}
作者 : ccl0504(手動程式產生器) 貼文超過200則
[ 貼文 448 | 人氣 211 | 評價 910 | 評價/貼文 2.03 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/26 下午 04:20:28
>serverSocket = gcnew Socket (AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
>IPAddress^ serverIP = IPAddress::Parse('127.0.0.1');
>IPEndPoint^ serverhost = gcnew IPEndPoint(serverIP, Int32::Parse('8888'));
>serverSocket->Bind(serverhost);
>serverSocket->Listen(Int32::MaxValue);
>
>clientSocket = serverSocket->Accept(); // 這個步驟以下,會造成程式的等待 (han住不動)
>

你的程式應該是在等待 client 端 connect, 所以才會停在這邊


作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/27 下午 02:04:34

>>serverSocket = gcnew Socket (AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp);
>>IPAddress^ serverIP = IPAddress::Parse('127.0.0.1');
>>IPEndPoint^ serverhost = gcnew IPEndPoint(serverIP, Int32::Parse('8888'));
>>serverSocket->Bind(serverhost);
>>serverSocket->Listen(Int32::MaxValue);
>>
>>clientSocket = serverSocket->Accept(); // 這個步驟以下,會造成程式的等待 (han住不動)
>>
>
>你的程式應該是在等待 client 端 connect, 所以才會停在這邊
>
>
>
我也覺得是在等待 client 端的 connect 及 data receive。
一定非得要接收到client的data 後,程式才可以繼續操作 (如點其它的button)。
而且等待(hand住不動)時,程式沒有報錯,所以 try catch 不會有資料。
感覺Server是單純在等待 clinet 。

但我有用過別人寫的 socket server GUI的程式,卻沒有我這個現象。
即使server socket建立且在監聽中,但他的程式並不會像。

我現在想法是,在執行 clientSocket = serverSocket->Accept(); 前在多做一些判斷。
或是透過timer持續做某些判斷,然後再執行accept後的動作。

這是我的想法啦,只是不知道.NET Socket Class 裡有沒有什麼可用的方法。

謝謝兩位的回應,我再努力看看。
作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/27 下午 02:20:20
我似乎找到原因 and 解決方法了。

原來是要用多緒或非同步方式處理,才不會有hand住(等待)的現象。

以下是文章的片斷:

Socket 之所以要用到多緒,是因為Server端在執行 Accept()等待Client端連上線時,程式會被hand住直到Client端連上線為止,如此主程式便無法再做任何直!!

 (原文請參考:http://keeppracticing.pixnet.net/blog/post/40203548)


謝謝大家的協助!

作者 : ccl0504(手動程式產生器) 貼文超過200則
[ 貼文 448 | 人氣 211 | 評價 910 | 評價/貼文 2.03 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/27 下午 02:33:03

用 thread 應該會比較好寫

作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/27 下午 04:01:09

>
>用 thread 應該會比較好寫
>
>

ok, I get it... 謝謝您的建議...

作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4466 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/27 下午 09:11:49
http://www.codeproject.com/Articles/2477/Multi-threaded-Client-Server-Socket-Class
作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/19 下午 08:51:14
ozzy123 您網址提供的 Sample code 是用MFC來寫的...?
我在 VC ++ 2010 Express 環境執行,缺少很多 .h 檔。

請問是否有 (.net) 來撰寫的 sample ??
謝謝..
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4466 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/20 上午 11:04:08
http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8chap.html

for you reference
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4466 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/20 上午 11:07:32
or this page -http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8b.html
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4466 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/20 上午 11:16:50
or this is a single article about C# socket programming - http://www.codeproject.com/Articles/10649/An-Introduction-to-Socket-Programming-in-NET-using
 板主 : 徵求中
 > Visual C++ .NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ .NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++ .NET
1 青衫 2220 
2 Raymond 1500 
3 joe 520 
4 冷眼 350 
5 CodeWarrior 260 
6 marlon 230 
7 小朱 210 
8 windblown 200 
9 XWLin 120 
10 小約翰 120 
Visual C++ .NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875