Winsock程式設計入門 4 面向連線的通訊

2021-09-07 21:03:17 字數 1564 閱讀 5639

面向連線的通訊是通過tcp/ip協議來實現的.tcp實現了兩台計算機之間可靠資料傳輸.當應用程式通過tcp通訊時,目標和源計算機之間就建立了乙個虛擬連線,一旦連線建立,就可以在目的和源計算機之間進行雙向的資料流傳輸.

伺服器api涵數

伺服器是乙個等待任意數量的客戶連線的程序,其目的是為客戶請求提供相應的服務.伺服器必須用通用的命名對連線進行監聽.在tcp/ip中,命名就是本地介面的ip位址和埠號.每乙個協議都有著不同的定址方式,因此其命名方法也不同.在winsock程式設計中,第一步就是要呼叫socket或wsasocket並將socket繫結到通用命名的協議.繫結是通過api方法bind完成的.接下來,將socket通過api函式listen設定為監聽模式.最後當客戶試圖連線時,使用api函式accept或wsaaccept接受接連. 繫結

一旦特定的協議被建立,你必須把它繫結到公開的位址,api函式associates將socket與公開的位址關聯,其函式宣告如下:

int bind(

socket                     s,

const struct sockaddr far* name,

int                        namelen

);引數說明:

s:表示等待客戶連線的socket.

name:是乙個sockaddr結構, 你必須用使用的協議進行填充,並轉換為sockaddr結構.winsock的標頭檔案將sockaddr結構定義為sockaddr型別. 

namelen:是指定了協議的位址結構的長度.

下面的示例說明了如何在tcp中使用bind:

socket               s;    

sockaddr_in          tcpaddr;

int                  port = 5150;

s = socket(af_inet, sock_stream, ipproto_tcp);

tcpaddr.sin_family = af_inet;

tcpaddr.sin_port = htons(port);    

tcpaddr.sin_addr.s_addr = htonl(inaddr_any);

bind(s, (sockaddr *)&tcpaddr, sizeof(tcpaddr));

上例中,乙個流socket被建立,接下來設定了用來接受客戶連線的tcp/ip位址結構.在這個例子中,socket被繫結到了乙個預設的特殊位址 -- inaddr_any,並占用了埠號5150.我們可以明確地指定乙個ip位址,但inaddr_any充許我們繫結到系統中所有可用的介面,這樣客戶通過任意介面(當然埠號要正確)進行連線都會被我們的監聽socket接受.呼叫bind通常使用本地ip和埠與socket建立關聯.

一旦出錯, bind將返回

socket_error. bind通常產生的錯誤是

wsaeaddrinuse.在tcp/ip中, wsaeaddrinuse表示另外的程序已經繫結了本地ip與埠或者指定的ip與埠處於

time_wait狀態.如果你對已經繫結的socket呼叫bind就會返回wsaefault.

Winsock程式設計入門 1

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

Winsock程式設計入門 2

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

Winsock程式設計入門 2

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