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