昨天晚上一時心起開始了假期這段時間學習的總結,沒有很系統的組織,只是想到一些有意義的,基礎性的東西想拿出來複習一下,這段時間每天都在寫代碼,提醒自己要注意每天的總結,卻還是落下了不少....慢慢來吧,幸好快開學了,時間相對多一些了。
好了開始今天的總結:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先從代碼開始:
Server端:
- //初始化Socket版本Winsock2.2
- WSADATA wsaData;
- WORD wVersion = MAKEWORD(2,2);
- int err = WSAStartup(wVersion,&wsaData);
- if(err != 0)
- return FALSE;
- //填充本地主機地址
- SOCKADDR_IN addrSer;
- memset(&addrSer,0,sizeof(addrSer));
- addrSer.sin_family = AF_INET;
- addrSer.sin_port = htons(m_nPort);
- addrSer.sin_addr.s_addr = inet_addr("10.1.17.212");
- //建立UDP套接字
- m_Listen =socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
- if (m_Listen == SOCKET_ERROR)
- return ;
- //綁定本地地址
- if (bind(m_Listen,(SOCKADDR*)&addrSer,sizeof(SOCKADDR)) != 0)
- return;
接下來建立循環等待用戶發送信息:
- TCHAR szBuf[MAX_PATH] = {0};
- while(1)
- {
- int nRecv = recvfrom(sock,(char*)szChat,
- MAX_PATH*sizeof(TCHAR),
- 0,
- (SOCKADDR*)&m_addrClient,
- &len);
- //SetWindowText顯示到社會分配或控件...
- }
Client:
- //..初始socket版本略
- SOCKADDR_IN addrSer,addrClient;
- //初始化Server地址
- memset(&addrSer,0,sizeof(addrSer));
- addrSer.sin_family = AF_INET;
- addrSer.sin_port = htons(m_sPort);
- addrSer.sin_addr.s_addr = inet_addr(addrArr);
- //建立UDP套接字
- SOCKET m_Client = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
- //由於UDP不需建立連接,只需知道對方地址就能通信(通信是不安全的),所以直接發送信息
- TCHAR szBuf[MAX_PATH] = {_T("Hello!")};
- while(1)
- {
- //發送信息關鍵字爲sendto,接收爲recvfrom
- sendto(m_Client,(char*)szBuf,
- MAX_PATH*sizeof(TCHAR),
- 0,(SOCKADDR*)&addrSer,
- sizeof(SOCKADDR));
- //顯示內容到窗體...
- }
由於現在所寫的程序都是阻塞的,所心建議在調試下一步一步地體會信息傳送過程。事實上,調試程序教會了我很多書本上學不到的東西,有的過程得自己去摸索才能真正體會。
總結一下:TCP和UDP的主要區別:
1.建立套接字
socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //TCP
socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //UDP
2.建立連接過程:
TCP建立連接過程服務端需要把本地地址bind以後監聽listen,然後是accept等待用戶連接(accept是阻塞的),客房端則需要bind服務端地址,然後connect請求建立連接,建立好後雙方就可以通信。
而UDP建立連接過程則簡單了許多,首先是服務端,僅需要與本地綁定,就可以等待接收信息。客戶端則只需與服務端地址綁定,就可以向服務端發送信息。
通過通信過程的建立可以看出,TCP穩定安全適合性能要求較高的連接通信,而UDP相對來說就沒有安全保障,對於事件處理比TCP少了許多,不過在局域網內很多都是通過UDP來建立聊天功能的。它只管發向對方,而不在乎傳送成功與否。而TCP則能保證信息發送到位,因此常用於文件傳輸。
好了今天就寫到這裏,明天我想把常用的幾種IO模型總結一下,一共五種,一次可能總結不完,慢慢來吧...