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...