socket是網路通訊端點的一種抽象,它提供了一種傳送和接收資料的機制。
面向連線的操作比無連線的操作效率低,但資料的安全性更高。
socket通訊流程
ip位址標誌主機,埠號標誌程序,ip加上埠號才能確定連線目標。
乙個網路連線需要以下5種資訊:
本地協議埠:指出接收報文或資料的程序。
遠端協議埠:指出目的程序或成。
協議:指出程式在網路上傳輸資料時使用的協議。
1.socket:用於建立乙個socket套接字。
socket socket(int af, //
使用的協議族
int type, //
socket型別
int protocol //
使用的協議位址
);
socket協議族在計算機裡表示為乙個整數,可以取值af_inet
socket型別有兩種:sock_stream和sock_dgram代表流socket和資料報socket
函式如果成功,返回乙個socket描述字,否則,返回invalid_socket。
socket s = socket(af_inet,sock_stream,0);
2.connect:用於嘗試與遠端建立乙個socket連線。
intconnect(
socket s,
//socket描述符
const
struct sockaddr* name, //
遠端的位址
int namelen //
遠端位址的長度
);
遠端位址是乙個sockaddr的結構
structsockaddr_in(
short sin_family, //
socket族
u_short sin_port, //
埠struct in_addr sin_addr, //
ip位址
char sin_zero[8] //
結構長度
);
函式如果連線成功,返回0,否則返回socket_error.對於非阻塞模式的socket連線,返回結果通常是socket_error,並且錯誤**為wsaewouldblock,表示連線正在進行,而不是乙個真正的錯誤。
建立連線通常是客戶端發出連線請求:
socket s;sockaddr_in serveraddr;
serveraddr.sin_family=af_inet;
serveraddr.sin_port=htons(port);
serveraddr.sin_addr.s_addr=inte_addr("
127.0.0.1");
connect(s,(sockaddr*)&serveraddr,sizeof(serveraddr));
3.send:用於在某個socket上向遠端傳送資料
intsend(
socket s,
//socket套接字
const
char* buf, //
存放傳送資料的緩衝區
int len, //
將要傳送的資料長度
int flags //
傳送時使用的附加引數
);
如果傳送成功,返回值為成功傳送的位元組數,否則返回socket_error。
4.recv:與傳送資料相對應的就是接收資料,函式recv用於接收端傳送的資料,函式原型為:
intrecv(
socket s,
//socket套接字
char* buf, //
存放接收資料的緩衝區
int len, //
將要接收的資料長度
int flags //接收
時使用的附加引數
);
接收資料成功,函式返回接收的位元組數,否則,返回socket_error。
5.closesocket:用於關閉不再需要的socket
intclosesocket(
socket s;
//socket套接字
);
關閉成功,返回0,否則返回socket_error。
6.listen:用於在某個socket上建立監聽
intlisten(
socket s,
//socket套接字
int backlog //
快取佇列的長度
);
如果建立監聽成功,返回0;否則返回socket_reeor
backlog引數。設為somaxconn,表示取系統連線的最大值。
7.accept:用於接收一條新的連線。
socket accept(socket s,
//監聽中的socket
struct sockaddr* addr ,//
表示位址結構體的指標
int* addrlen//
位址結構體的長度
);
函式執行成功,返回0;否則,返回socket_error.
8.bind:用於給乙個socket套接字分配乙個本地協議位址
intbind(
socket s,
//socket套接字
const
struct socketaddr* name,//
表示位址結構體的指標
int namelen//
位址結構體的長度
);
函式執行成功,返回0;否則,返回socket_error.
9.select:用於檢測socket狀態,主要用於高階的網路通訊模型
intselect
(int nfds,//
winsocj中此引數無意義
fd_set* readfds,//
進行可讀檢測的socket
fd_set* writefds,//
進行可寫檢測的socket
fd_set* exceptfds,//
進行異常檢測的socket
const
struct timeval* timeout//
非阻塞模式中設定最大等待時間
);
函式執行成功,返回0;否則,返回socket_error.
ascii位址->整數字址
#include int inet_aton(constchar* straddr,struct in_addr* adrp);
返回:0表示轉換不成功;1表示轉換成功。
整數字址->ascii位址
#include char *inet_ntoa(struct in_addr inaddr);
返回:null程式設計轉換不成功;其他返回值表示轉換成功。
網域名稱位址->整數字址
#include struct hostent *gethostname(constchar *name);
整數字址->網域名稱位址
#include struct hostent *gethostbyaddr(constchar *addr,int len,int family);
儲存位元組的格式:
函式命名規律:
h代表位元組順序(本機順序),n代表網路順序(network)
//本地位元組轉化為網路位元組順序(長整數)
u_long pascal far htonl(in u_long hostlong);
//本地位元組轉化為網路位元組順序(短整數)
u_short pascal far htons(in u_short hostshort);
//網路位元組轉化為本地位元組順序(長整數)
u_long pascal far ntohl(in u_long netlong);
//網路位元組轉化為本地位元組順序(短整數)
u_short pascal far ntohs(in u_short netshort);
第16章 網路程式設計 2
16.3 python中的網路程式設計 16.3.1 socket 模組函式 使用socket.socket 函式來建立套接字。socket socket family,socket type,protocol 0 import socket tcpsock socket.socket socket...
unix網路程式設計第2版 卷1 第6章 同步
6.1概述 在5.12節中,我們看到tcp客戶同時處理兩個輸入 標準輸入和tcp套介面。我們遇到的問題是客戶阻塞於 標準輸入上的 fgets呼叫,而伺服器程序又被殺死。伺服器tcp雖正確地給客戶tcp發了乙個fin,但客戶程序正阻塞於從標準輸入讀入,它直到從套介面讀時才能看到此檔案結束符 可能已經過...
MOOC清華《程式設計基礎》第1章第2題 求周長
題目描述 mooc清華 程式設計基礎 第1章第2題 求周長,已知乙個圓的半徑是2,請編寫程式計算輸出它的周長。要求計算中以3.14159作為圓周率的值。保留小數點後5位 輸入描述 無輸出描述 輸出圓形周長 附加說明 保留小數點的功能需要包含iomanip標頭檔案,並在輸出數字前加上 例如 cout ...