int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
cout << "Press ESCAPE to terminate program/r/n";
AfxBeginThread(ServerThread,0);
while(_getch()!=27);
return nRetCode;
}
UINT ServerThread(LPVOID pParam)
{
// SOCKET其實是unsigned int的一個typedef。
// 在Unix中,套接字句柄就像檔案句柄一樣,都是unsigned int。
// 既然在Windows下這些不是真的,那麼我們就定義了一種新的資料類型,名為SOCKET。
SOCKET server;
// WSADATA是一個struct,WSAStartup的調用将會填充之。
WSADATA wsaData;
// sockaddr_in為TCP/IP套接字指定了套接字的位址。
// 其它的協定都使用相似的結構。
sockaddr_in local;
// WSAStartup為程式調用WinSock進行了初始化。
// 第一個參數指定了程式允許使用的WinSock規範的最高版本。
int wsaret=WSAStartup(0x101,&wsaData);
// 如果成功,WSAStartup傳回零。
// 如果失敗,我們就退出。
if(wsaret!=0)
{
return 0;
}
// 現在我們來為sockaddr_in結構指派。
local.sin_family=AF_INET; // 位址族
local.sin_addr.s_addr=INADDR_ANY; // 網際IP位址
local.sin_port=htons((u_short)20248); // 使用的端口
// 由socket函數建立我們的SOCKET。
server=socket(AF_INET,SOCK_STREAM,0);
// 如果socket()函數失敗,我們就退出。
if(server==INVALID_SOCKET)
{
return 0;
}
// bind将我們剛建立的套接字和sockaddr_in結構聯系起來。
// 它主要使用本地位址及一個特定的端口來連接配接套接字。
// 如果它傳回非零值,就表示出現錯誤。
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
return 0;
}
// listen指令套接字監聽來自用戶端的連接配接。
// 第二個參數是最大連接配接數。
if(listen(server,10)!=0)
{
return 0;
}
// 我們需要一些變量來儲存用戶端的套接字,是以我們在此聲明之。
SOCKET client;
sockaddr_in from;
int fromlen=sizeof(from);
while(true) // 無限循環
{
char temp[512];
// accept()将會接收即将到來的用戶端連接配接。
client=accept(server,
(struct sockaddr*)&from,&fromlen);
sprintf(temp,"Your IP is %s/r/n",inet_ntoa(from.sin_addr));
// 我們簡單地向用戶端發送這個字元串。
send(client,temp,strlen(temp),0);
cout << "Connection from " << inet_ntoa(from.sin_addr) <<"/r/n";
// 關閉用戶端套接字
closesocket(client);
}
// closesocket()關閉套接字,并釋放套接字描述符。
closesocket(server);
// 最初這個函數也許有些用處,現在保留它隻是為了向後相容。
// 但是調用它可能會更安全,因為我相信某些實作會使用它來結束WS2_32.DLL的使用。
WSACleanup();
return 0;
}
運作這個伺服器,并在它運作的時候使用telnet來連接配接機器的20248端口。如果你是在同一台機器上使用,那麼就連接配接到localhost。
示例輸出
我們将會在伺服器上看到這樣的輸出:
E:/work/Server/Debug>server
Press ESCAPE to terminate program
Starting up TCP server
Connection from 203.200.100.122
Connection from 127.0.0.1
E:/work/Server/Debug>
這是用戶端得到的:
[email protected]:~$ telnet 202.89.211.88 20248
Trying 202.89.211.88...
Connected to 202.89.211.88.
Escape character is '^]'.
Your IP is 203.200.100.122
Connection closed by foreign host.
[email protected]:~$