套接字(二) Socket 套接字程式設計(附例項)

2021-06-25 23:56:19 字數 4231 閱讀 7726

tcp/ip位址家族統一的套接字位址結構定義如下:

struct sockaddr_in

sin_family 指定使用該套接字位址的位址家族。 這裡必須設定為af_inet,表示程式所使用的位址家族是tcp/ip;

sin_zero[8] 主要是為了與第乙個版本的套接字位址結構大小相同而設定,實際使用時,將這8個位元組設定為0即可。

sin_addr 表示32為的ip位址結構 結構定義如下:

struct in_addr

s_un_b; //用4個u_char字元描述ip位址

struct

s_un_w; //用2個u_short型別描述ip位址

u_long s_addr;//用1個u_long型別描述ip位址

} s_un;

#define s_addr s_un.s_addr

};

通常,使用乙個u_long型別的字元進行描述ip位址即可。

sockaddr_in addr;

addr.sin_addr.s_un.s_addr = inet_addr("218.6.132.5");

socket 套接字程式設計中,傳輸資料的排列順序以網路位元組順序和主機位元組順序為主。

資料在主機儲存時,是以主機位元組順序儲存的。

資料要通過網路傳送,需要轉換為網路位元組順序。否則會造成損壞。

網路位元組是將重要的位元組優先儲存,而主機位元組順序則相反。

winsock 中的網路位元組和主機位元組的轉換函式

主機位元組->網路位元組

u_short htons(u_short hostshort); //u_short 型別的ip位址

u_long htonl(u_long hostlong); //u_long

unsigned long inet_addr(const char far* cp);//字串ip

網路位元組->主機位元組

u_long ntohl(u_long hostlong);//u_long

u_short ntols(u_short hostshort);//u_short

char far* inet_ntoa(struct in_addr in);//字串ip

具體使用:

sockaddr_in addrto;

addrto.sin_family=af_inet;

addrto.sin_port=htons(8900);

addrto.sin_addr.s_un.s_addr=inet_addr("127.0.0.1");

char address = inet_ntoa(addrto.sin_addr.s_un.s_addr);

socket 相關函式

1.建立套接字

csocket 類建立套接字是通過其建構函式建立的

csocket :: csocket();

建立csocket物件

csocket sock;

或csocket *sock;

sock = new csocket;

2.繫結位址資訊

如果套接字物件是伺服器套接字,那麼該套接字應該呼叫該類的函式bind()將套接字物件與伺服器位址資訊繫結在一起。

bool bind(const sockaddr* lpsockaddr,int nsockaddrlen);

lpsockaddr 位址結構

nsockaddrlen 位址結構長度

位址繫結成功後,還要呼叫函式listen()在指定埠監聽客戶端的連線請求。 函式listen()的原型如下:

bool listen(int nconnectionbacklog = 5);

ncontectionbacklog 表示套接字監聽客戶請求的最大數目。有效範圍1~5。

具體呼叫

csocket sock;

sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_port = htons(80);

addr.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");

sock.bind((sockaddr*)addr,sizeof(addr)); //繫結套接字的位址結構

sock.listen(5);

3.連線伺服器

客戶端建立套接字成功後,呼叫函式connect()向伺服器傳送連線請求。

bool connect(const sockaddr* lpsockaddr,int nsockaddrlen);

lpsockaddr          連線的伺服器位址結構

nsockaddrlen     伺服器位址結構長度

具體呼叫:

csocket sock;

sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_port = htons(80);

addr.sin_addr.s_un_s_addr = inet_addr("127.0.0.1");

sock.connect((sockaddr*)addr,sizeof(addr));//連線伺服器

4.資料交換

通過send()和receive()進行資料交換

函式原型

virtual int send(const void lpbuf,int nbuflen,int nflags = 0);

virtual int receive(void* lpbuf,int nbuflen,int nflags = 0);

lpbuf: 資料緩衝區位址

nbuflen:資料緩衝區的大小  

nflags : 資料傳送或接收標誌,一般情況都設定為0

...

char buff = 'a';

sock.send(&buff,sizeof(buff),0);

sock.receive(&buff,sizeof(buff),0);

5.關閉套接字物件

服務端和客戶端的通訊完成後,呼叫函式close()將套接字物件關閉

sock.close();

注意:csocket類的標頭檔案 afxsock.h  使用時,必須引入此檔案 

#include

伺服器端**:

//#include "stdafx.h"

#include #include #pragma comment(lib,"ws2_32.lib")

int main(int argc, char* argv)

//5.關閉套接字物件

::closesocket(s);

::closesocket(s1);

//6.釋放套接字型檔

::wsacleanup();

if(getchar())

else

}}客戶端**:

//#include #include #include #pragma comment(lib,"ws2_32.lib")

int main(int argc, char* argv)

; s = ::socket(af_inet,sock_stream,0); //建立tcp套接字

sockaddr_in addr; //定義套接字位址結構

addr.sin_family = af_inet;

addr.sin_port = htons(75);

addr.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");

printf("客戶端已經啟動 \r\n");

//3.連線伺服器

::connect(s,(sockaddr*)&addr,sizeof(addr));

//4.接收伺服器訊息

::recv(s,sztext,sizeof(sztext),0);

printf("%s \r\n",sztext);

//5.關閉套接字物件

::closesocket(s);

//6.釋放套接字型檔

::wsacleanup();

if(getchar())

else }

網路程式設計 Socket 套接字

網路程式設計 目前較為流行的網路程式設計模型是客戶機 伺服器 c s 結構。即通訊雙方一方作為服務 器等待客戶提出請求並予以響應。客戶則在需要服務時向伺服器提出申請。伺服器一般作為 守護程序始終執行,監聽網路埠,一旦有客戶請求,就會啟動乙個服務程序來響應該客 戶,同時自己繼續監聽服務埠,使後來的客戶...

socket套接字程式設計函式

呼叫socket函式建立套接字 呼叫bind函式分配ip位址和埠 呼叫listen函式轉為可接收請求狀態 呼叫accept函式受理連線請求 include 成功時返回檔案描述符,失敗時返回 1 int socket int domain,int type,int protocol 協議族 proto...

網路程式設計socket套接字

socket 建立乙個socket,主動套介面。bind 繫結ip和埠號到socket,需先配置ip 埠號。connect 客戶機 client 端和伺服器傳送請求建立連線。listen 伺服器 serv 監聽client傳送的請求。accept 完成連線,阻塞響應。sendto 傳送資料 recv...