網絡編程入門知識
Linux系統是通過提供套接字(socket)來進行網絡編程的.網絡程序通過socket和其它幾個函數的調用。
socket通常也稱作"套接字",用於描述IP 地址和端口,是一個通信鏈的句柄,也可以看成是一種文件描述符 。socket實質上提供了進程通信的端點。進程通信之前,雙方首先必須各自創建一個端點,否則是沒有辦法建立聯系並相互通信的。正如打電話之前,雙方必須各自擁有一台電話機一樣。
socket類型:
①。流式套接字(SOCK_STREAM)
流式套接字可以提供可靠的,面向連接的通訊流,它使用TCP協議。
②。數據報套接字(SOCK_DGRAM)
數據報套接字定義了一種無連接的服務,數據報通過相互獨立的報文進行傳輸,是無序的並且不保證可靠 ,它用UDP協議。
③。原始套接字(SOCK_RAM)
原始套接字允許使用IP協議,主要用於新的網絡協議的測試等。
在socket程序設計中,struct sockaddr用於記錄網絡地址,其結構如下:
struct sockaddr
{
u_short sa_family;//協議簇,采用AF_XXX形式,如AF_INET(IP協議簇)。
char sa_data[14]; // 14字節的特定協議地址
}
然而編程一般使用與sockaddr等價的sockaddr_in結構,sockaddr_in結構如下:
struct sockaddr_in
{
short int sin_family ; //協議簇
unsigned short int sin_port; //端口號
struct in_addr sin_addr; //協議特定地址,具體結構看下面 ····
unsigned char sin_zero[8]; //填0
}
struct in_addr的結構如下:
struct in_addr
{
union
{
struct{unsigned char s_b1,s_b2,s_b3,s_b4;}S_un_b; // An IPv4 address formatted as four u_chars.
struct{unsigned short s_w1,s_w2;}S_un_w; // An IPv4 address formatted as two u_shorts
unsigned long s_addr; // An IPv4 address formatted as a u_long.
}S_un;
}
地址轉換
int inet_aton(const char *cp,struct in_addr *inp);
char *inet_ntoa(struct in_addr *inp);
函數里面的 a 代表 ASCII,n 代表 network
inet_aton函數是將a.b.c.d形式的IP轉換為32位的IP存儲在inp指針里。
inet_ntoa函數是將32位的IP地址轉換位a.b.c.d的格式。
字節序轉換
htons函數:把unsigned short類型從主機序轉換到網絡序
htonl函數:把 unsigned long類型的從主機序轉換到網絡序
ntohs函數:把unsigned short類型從主機序轉換到網絡序
ntols函數:把unsigned long類型從主機序轉換到網絡序
IP與主機名
struct hostent *gethostbyname(const char *hostname); //獲得主機名的函數,其返回值是一個名hostent的結構體
struct hostent的結構如下:
struct hostent
{
char *h_name; //主機的正式名稱
char *h_aliases; //主機的別名
int h_addrtype; //主機的地址類型,AF_INET
int h_length; //主機的地址長度
char **h_addr_list; //主機的ip地址列表
}
#define h_addr h_addr_list[0] //主機的第一個IP地址
socket編程函數
1. int socket(int domain, int type, int protocol);
創建一個socket,返回值:非負數-----創建成功,-1-------創建失敗
family:協議簇
type:套接字的類型:是流式套接字?數據報套接字還是原始套接字?
protocol: 套接口所用的協議。如調用者不想指定,可用 0
其返回值:調用成功就返回新創建的套接字的描述符,如果失敗就返回INVALID_SOCKET。
2. int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
用於綁定Ip地址和端口號到socket
socket:是一個套接字。
address:是一個sockaddr結構指針,該結構中包含了要結合的地址和端口號。
address_len:確定緩沖區的長度。
其返回值:如果函數執行成功,返回值為0,否則為SOCKET_ERROR。
3. int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
該函數用於與服務器建立連接
sockfd:套接字描述符
serv_addr:指向數據機構sockaddr的指針,其中包括目的端口和IP地址
addrlen:參數二sockaddr的長度。(可以通過sizeof(struct sockaddr)獲得 )
其返回值:成功則返回0,失敗返回-1。
4. int listen(int sockfd, int backlog);
listen函數在一般在調用bind之后-調用accept之前調用。
sockfd:套接字描述符
backlog:連接請求隊列(queue of pending connections)的最大長度(一般由2到4)。用SOMAXCONN則由系統確定。
其返回值:無錯誤,返回0, 否則,返回SOCKET ERROR,可以調用函數WSAGetLastError取得錯誤代碼。
5. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
該函數用來等待來自客戶端的socket連接請求。
sockfd:套接字描述符
addr:指向結構體sockaddr的指針。
addrlen: addr參數指向的內存空間的長度。
其返回值:成功返回新套接字描述符;失敗返回錯誤信息 。
6. size_t send ( int s , const void *msg , size_t len , int flags);
該函數用來發送數據
s:發送端套接字描述符;
msg:一個存放應用程式要發送數據的緩沖區;
len:實際要發送的字節數;
flags:一般為0
其返回值:成功則返回實際傳送出去的字符數,失敗返回-1,錯誤原因存於errno 中。
7. int recv( int s, coid* msgbuf, size_t len, int flags);
該函數用於接收數據
s:一個標識已連接套接口的描述字。
len:緩沖區長度。
flags:指定調用方式。
以上純屬個人自學總結的知識,歡迎大神指正批評········