天天看點

winsocket 的最簡單的一個例子

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]:~$