LINUX C網絡編程學習筆記-----------入門知識


網絡編程入門知識

 

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函數使用主動連接套接口變為被連接套接口,使得一個進程可以接受其它進程的請求,從而成為一個服務器進程。在TCP服務器編程中listen函數把進程變為一個服務器,並指定相應的套接字變為被動連接。   

    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:一個標識已連接套接口的描述字。

   msgbuf:用於接收數據的緩沖區
   len:緩沖區長度。

   flags:指定調用方式。

 

以上純屬個人自學總結的知識,歡迎大神指正批評········ 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM