Winsock程式設計入門 1

2021-04-01 09:22:24 字數 3067 閱讀 6490

一、簡單的tcp伺服器

介紹

winsock api是一套供microsoft windows作業系統使用的套接字程式庫,它最初基於berkeley套接字,但是其中加入了一些microsoft的特殊改動。在這篇文章中,我要試著給你介紹如何使用winsock來進行套接字程式設計,並假設你沒有在任何作業系統上進行過網路程式設計的經驗。

如果你只有一台單獨的機器,那麼不用著急,你仍然可以進行winsock程式設計。你可以使用名為localhost的本地回環位址,它的ip位址是127.0.0.1。這樣一來,如果你在機器上執行了乙個tcp伺服器,那麼同一機器上的客戶端程式就可以使用這個回環位址連線到伺服器了。

簡單的tcp伺服器main函式

int _tmain(int argc, tchar* argv, tchar* envp)

我們在main()中所做的是開啟乙個執行緒,然後對乙個_getch()呼叫進行迴圈。_getch()僅僅是等待乙個鍵的按下,並返回這個讀入字元的ascii值。我們一直迴圈,直到返回27這個值為止——既然27是escape鍵的ascii碼。你可能想知道的是,即使我們按下了escape,我們開啟的執行緒也還會是活動的狀態。不用為這些事情擔心,因為當main()返回的時候,程序就會被終止,主線程開啟的執行緒也會被突然終止。

(我注:main是乙個主線程,上面所講的serverthread是在主線程裡開的乙個守護執行緒,主線程開啟乙個守護執行緒後,任由守護執行緒去執行,main主線程還可以執行下去執行while(_getch()!=27)這句,當使用者敲乙個esc鍵,就會接下去執行return nretcode這句,進而main主線程結束,主線程結束後,守護執行緒就跟著結束了。另,在主線程裡也可以開普通執行緒,普通執行緒不同於守護執行緒,main主線程在開普通執行緒處要停止執行下面的**,而要等到普通執行緒執行完畢返回才接著執行main主線程後面的語句)

serverthread函式

現在我所要做的事情就是把我們的serverthread函式列出來,並使用**的注釋來解釋相關的**行做了些什麼。我們的tcp伺服器主要做的事情是監聽埠20248,這個數字也就是我在code project的成員id。這個過程中的事件是:當客戶端連線的時候,伺服器將會向客戶端發回一條訊息告知它的ip位址,然後關閉連線並繼續接收20248埠的連線。它還會在執行的控制台上列印出連線來自的ip位址。總而言之,你可能會認為這是乙個絕對沒用的程式。事實上,你們中的有些人甚至可能會認為它和windows中的sndrec32.exe一樣沒用。我說,你們也忒苛刻了吧。

uint  serverthread(lpvoid pparam)

// 現在我們來為sockaddr_in結構賦值。

local.sin_family=af_i***; // 位址族

local.sin_addr.s_addr=inaddr_any; // 網際ip位址

local.sin_port=htons((u_short)20248); // 使用的埠

// 由socket函式建立我們的socket。

server=socket(af_i***,sock_stream,0);

// 如果socket()函式失敗,我們就退出。

if(server==invalid_socket)

// bind將我們剛建立的套接字和sockaddr_in結構聯絡起來。

// 它主要使用本地位址及乙個特定的埠來連線套接字。

// 如果它返回非零值,就表示出現錯誤。

if(bind(server,(sockaddr*)&local,sizeof(local))!=0)

// listen命令套接字監聽來自客戶端的連線。

// 第二個引數是最大連線數。

if(listen(server,10)!=0)

// 我們需要一些變數來儲存客戶端的套接字,因此我們在此宣告之。

socket client;

sockaddr_in from;

int fromlen=sizeof(from);

while(true) // 無限迴圈

// closesocket()關閉套接字,並釋放套接字描述符。

closesocket(server);

// 最初這個函式也許有些用處,現在保留它只是為了向後相容。

// 但是呼叫它可能會更安全,因為我相信某些實現會使用它來結束ws2_32.dll的使用。

wsacleanup();

return 0;

}測試

執行這個伺服器,並在它執行的時候使用tel***來連線機器的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>

這是客戶端得到的:

nish@sumida:~$ tel*** 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.

nish@sumida:~$

總結

呃,在本文中你了解了如何建立乙個簡單的tcp伺服器。在以後的文章中,我會給你一些更多的材料,你可以通過這些材料建立乙個合適的tcp客戶端。如果有誰對於編譯這些**有問題的話可以mail我,我會發給你乙個壓縮了的工程。謝謝您的閱讀。

Winsock程式設計入門 2

二 簡單的tcp客戶端 介紹 本文是 winsock程式設計入門 1 簡單的tcp伺服器 一文的結局,如果你還沒有讀過第1部分的話,我還是建議你首先讀一下。在本文中,我將示範給你如何編寫乙個簡單的tcp客戶端程式。我們要編寫乙個程式,這個程式將連線到乙個http伺服器,並獲得乙個檔案。乙個簡單的tc...

Winsock程式設計入門 2

二 簡單的tcp客戶端 介紹 本文是 winsock程式設計入門 1 簡單的tcp伺服器 一文的結局,如果你還沒有讀過第1部分的話,我還是建議你首先讀一下。在本文中,我將示範給你如何編寫乙個簡單的tcp客戶端程式。我們要編寫乙個程式,這個程式將連線到乙個http伺服器,並獲得乙個檔案。乙個簡單的tc...

Winsock程式設計筆記 1

tcp ip統一規定使用大尾方式傳輸資料,即網路位元組序 intel amd的計算機一般都是小尾方式儲存資料 所以當計算機想通過網路傳輸一串資料給另一台計算機時,都會經歷如下過程的轉換 1.inet addr是把由小數點分割的ip位址字串轉成由32位二進位制表示的網路位元組序ip位址 ip字串 32...