?????????第一點經(jīng)驗就是在創(chuàng)建新的套接字之前還需要調(diào)用一個引入Ws2_32.dll庫的函數(shù)。否則服務器和客戶端連不上。
由于初次使用socket,所以查了很多資料,但是發(fā)現(xiàn)一個問題,不知道為什么按照資料上的步驟調(diào)用函數(shù),但是最后卻連接不上,詳細查過MSDN后,才發(fā)現(xiàn)大部分的資料上都是從調(diào)用socket開始,其實在這之前還有一個初始化的函數(shù)需要調(diào)用。
如果使用Platform SDK:Windows Sockets,在調(diào)用socket函數(shù)創(chuàng)建新的sockets之前要先調(diào)用WSAStartup函數(shù)。WSAStartup函數(shù)作用是引入Ws2_32.dll庫。根據(jù)MSDN上說,WSAStartup函數(shù)必須是應用程序或DLL調(diào)用的第一個Windows Sockets函數(shù),它允許應用程序或者DLL指定需要的Windows Sockets版本和重新找回指定的Windows Sockets執(zhí)行的細節(jié)。只有在成功的調(diào)用WSAStartup函數(shù)之后才能進一步使用接下來的Windows Sockets函數(shù)。
同理,如果使用的是MFC包裝的CSocket類,需要在調(diào)用Cresat創(chuàng)建新的套接字之前調(diào)用AfxSocketInit函數(shù)。AfxSocketInit函數(shù)包裝的是WSAStartup函數(shù),作用是相同的。
第二點經(jīng)驗就是使用socket編程時,每調(diào)用一個函數(shù)如bind,listen等,如果出錯可以使用WSAGetLastError ()函數(shù)得到錯誤的編號,如果是MFC的CSocket類,使用GetLastError()函數(shù)得到錯誤的編號。但是得到的編號是整形量,對調(diào)試沒有意義,所以建議大家可以使用下面的程序得到中文錯誤信息。
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默認語言
(LPTSTR)&lpMsgBuf, 0, NULL );
//顯示
MessageBox(0,(LPCTSTR)lpMsgBuf,_T("GetLastError"),MB_OK|MB_ICONINFORMATION );
//釋放內(nèi)存
::LocalFree( lpMsgBuf );
這就是我的2點經(jīng)驗,希望對初學socket的朋友有所幫助。