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