1. 程式人生 > >tcp/ip模型及函式

tcp/ip模型及函式


    
1.套接字建立函式:
int socket(int domain, int type, int protocol)
引數domain:表示要建立套接字的協議族,主要取值:
         AF_UNIX:建立一個只在本機內進行通訊的套接字;
         AF_INET:使用Ipv4 TCP/IP協議;
         AF_INET6:使用Ipv6 TCP/IP協議
引數type:表示要建立套接字型別,取值有:
         SOCK_STREAM:建立一個TCP套接字;
         SOCK_DGRAM:建立一個UDP套接字;
         SOCK_RAM:建立一個原始套接字
引數protocol:表示通過引數domain和type指定的套接字型別確定使用的協議;當建立原
始套接字時,系統無法唯一確定協議,此時就需要使用該引數指定所使用的協議。
函式返回值:執行成功返回新建立的套接字,失敗返回-1,錯誤程式碼存入error。

2.繫結埠函式
      int bind(int fd, _CONST_SOCKADDR_ARG addr, socklen_t len)
功能:將一個埠繫結到某個套接字上,該函式常用在伺服器端;
引數fd:表示要繫結的(伺服器端的)套接字描述符;
引數addr:表示要繫結的(伺服器端)IP地址;
引數len:表示要繫結的IP長度
3.監聽函式
     int listen(int fd, int n);
功能:將一個套接字轉化為監聽套接字,常用在伺服器端監聽來自客戶端的連線請求;
引數fd:表示監聽套接字描述符;
引數n:表示最大監聽個數

4.建立連線函式
      int connect(int fd, _CONST_SOCKADDR_ARG addr, socklen_t len)
功能:在指定的套接字上建立一個連線;
引數fd:要連線的服務期端的套接字,若該套接字為SOCK_STREAM,則connect向伺服器
發起連線請求;
引數addr:要連線的伺服器端的IP和埠號;
引數len:表示地址addr長度
**若是TCP連線,只能呼叫一次connect函式建立連線;若是UDP,則可以多次呼叫該函式來改變傳送資料的目的地址

5.接受連線函式
      int accept(int fd, _SOCKADDR_ARG addr, socklen_t *addr_len)


功能:接受來自監聽套接字的請求;
引數fd:表示一個監聽套接字;
引數addr:表示用來儲存發起連線的主機的埠號和IP;
引數addr_len:表示addr長度;
返回值:返回一個和伺服器建立連線的客戶端的套接字

6.TCP的傳送資料函式
       ssize_t send(int fd, const void *buf, size_t n, int flags)
引數fd:表示建立起連線的套接字(客戶端套接字);
引數buf:要傳送資料的緩衝區地址;
引數n:傳送資料的長度;
引數flags:表示控制選項,一般取0

8.只接受TCP資料函式
      ssize_t recv(int fd, void *buf, size_t n, int flags)
引數fd:表示連線套接字(伺服器端);
引數buf:表示接受緩衝區;
引數n:表示接受緩衝區大小;
引數flags:一般為0;

9.UDP傳送資料函式
      int sendto(int fd, const void *buf, size_t n, int flags, _CONST_SOCKADDR_ARG addr, socklen_t addr_len)
引數fd:表示建立起連線的套接字(客戶端套接字);
引數buf:要傳送資料的緩衝區地址;
引數n:傳送資料的長度;
引數flags:表示控制選項,一般取0
引數addr:若該引數非空,則表示不是面向連線的;
引數addr_len:表示addr長度

10.接受資料函式
ssize_t recvfrom(int fd, void *buf, size_t n, int flags, _SOCKADDR_ARG addr, socklen_t *addr_len)
功能:接受TCP或UDP資料;
引數fd:表示連線套接字(伺服器端);
引數buf:表示接受緩衝區;
引數n:表示接受緩衝區大小;
引數flags:一般為0;
引數addr:若該引數非空,則表示不是面向連線的;
引數addr_len:表示addr長度

sockaddr、sockaddr_in和in_addr三者的區別:
1)    struct sockaddr
{
unsigned short sa_family;
char sa_data[14];
}
2)    struct sockaddr_in
{
short int sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}
3)    struct in_addr
{
union{
    struct (u_char s_b1, s_b2, s_b3, s_b4;)S_un_b;
    struct {u_short s_w1, s_w2; }S_un_w;
    u_long S_addr;
}S_un;

#define s_addr S_un.S_addr
};
或者
struct in_addr
{
    in_addr_t s_addr;
}
*sockaddr和sockaddr_in都是16Bytes;
 in_addr是4Bytes