從容關閉

從容關閉即按下選單鍵選擇關機,或用ALT+F4

SOCKET 編程套接字實現 從容關閉

closesocket(client);
WSACleanup();//關閉連線
CListBox 實現自動往下滾 m_list.SetCurSel(m_list.GetCount()-1);
10093
int shutdown(
__in SOCKET s,
__in int how
);//使SOCKET對象失去傳送和接收對象的能力
根據參數的不同 效果也不懂 當 how 為SD_RECEIVE,SD_SEND,SD_BOTH 分別對作用是 失去 傳送,接受,兩者都不能的能力
一個完整的斷開SOCKET的過程
1. Call WSAAsyncSelect to register for FD_CLOSE notification.//介紹http://blog.donews.com/zwell/articles/198830.aspx
第一步在用到以Windows訊息為基礎的網路事件通知的時候才用
2. Call shutdown with how=SD_SEND.
3. When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
4. Call closesocket.
WSACleanup 停止使用Winsock 2 DLL (ws2_32.dll).
int WSACleanup(void);
printf遇0則結束
shutdown 後 還可以使用該SOCKET
if(printf("hello world\n"),5<=1,5>2,5<6) 奇怪的if寫法 只看最後表達式是否正確 正確後才執行 {}中的語句
創建用戶列表(數組)客戶端與客戶端連線 連結資料庫 存儲聊天記錄
用戶信息表
用戶名
聊天記錄表結構
用戶名ID 內容 時間
用戶登錄情況表
用戶名ID 登錄時間 登錄IP
1、 S啟動兩個網路偵聽,一個叫【主連線】偵聽,一個叫【協助打洞】的偵聽。
2、 A和B分別與S的【主連線】保持聯繫。
3、當A需要和B建立直接的TCP連線時,首先連線S的【協助打洞】連線埠,並傳送協助連線申請。同時在該連線埠號上啟動偵聽。注意由於要在相同的網路終端上綁定到不同的套接字上,所以必須為這些套接字設定 SO_REUSEADDR 屬性(即允許重用),否則偵聽會失敗。
4、 S的【協助打洞】連線收到A的申請後通過【主連線】通知B,並將A經過NAT-A轉換後的公網IP位址和連線埠等信息告訴B。//每次connect時使用的都是不同的連線埠
5、 B收到S的連線通知後首先與S的【協助打洞】連線埠連線,隨便傳送一些數據後立即斷開,這樣做的目的是讓S能知道B經過NAT-B轉換後的公網IP和連線埠號。/////(同上 多餘的吧)
6、 B嘗試與A的經過NAT-A轉換後的公網IP位址和連線埠進行connect,根據不同的路由器會有不同的結果,有些路由器在這個操作就能建立連線(例如我用的TPLINK R4'02),大多數路由器對於不請自到的SYN請求包直接丟棄而導致connect失敗,但NAT-A會紀錄此次連線的源地址和連線埠號,為接下來真正的連線做好了準備,這就是所謂的打洞,即B向A打了一個洞,下次A就能直接連線到B剛才使用的連線埠號了。
7、 客戶端B打洞的同時在相同的連線埠上啟動偵聽。B在一切準備就緒以後通過與S的【主連線】回復訊息“我已經準備好”,S在收到以後將B經過NAT-B轉換後的公網IP和連線埠號告訴給A。
8、 A收到S回復的B的公網IP和連線埠號等信息以後,開始連線到B公網IP和連線埠號,由於在步驟6中B曾經嘗試連線過A的公網IP地址和連線埠,NAT-A紀錄了此次連線的信息,所以當A主動連線B時,NAT-B會認為是合法的SYN數據,並允許通過,從而直接的TCP連線建立起來了。
// 客戶節點信息
struct stUserListNode
{
char userName[10];
unsigned int ip;
unsigned short port;
};
CList是一個雙向鏈表類。http://blog.csdn.net/benny5609/archive/2007/10/10/1818962.aspx
1、頭檔案名稱不可少
Clist類定義在Afxtempl.h 頭檔案中,因此在使用該時,需要加這個頭檔案名稱。
CList list;
CString str1="hello";
CString str2="world";
CString str3="my";
CString str4="life";
list.AddTail(str1);
list.AddTail(str2);
list.AddTail(str3);
list.AddTail(str4);
POSITION pos = list.GetHeadPosition();
while(pos!=NULL)
{
pDC->TextOut(200,200,GetNext( POSITION& rPosition ) );//假設代碼是在View類中的OnDraw()
//函數裡
}
//struct 結構定義
struct struct-name : inheritance-list {
public-members-list;
protected:
protected-members-list;
private:
private-members-list;
} object-list;
//object-list 對象類表
//inheritance-list 繼承列表
//默認 public
//union 聯合定義 和結構相比 沒有繼承特性 不能定義protected 保護成員
union union-name {
public-members-list;
private:
private-members-list;
} object-list;
struct stMessage
{
int iMessageType;
union _message
{
stLoginMessage loginmember;
stLogoutMessage logoutmember;
stP2PTranslate translatemessage;
}message;
};//奇怪的 數組定義方式
for(int i=0;i
{}//c++for語句是;隔開的

相關詞條

相關搜尋

熱門詞條

聯絡我們