UNIX環境高級編程——網絡編程經常使用函數及結構

IP地址的轉換

#include <arpa/inet.h> 

int inet_aton(const char *strptr, 
                    struct in_addr *addrptr);
//將strptr字符串轉換成32位的網絡字節序(二進制值--a.b.c.d->32)。

int_addr_t inet_addr(const char *strptr)
//功能通上,返回地址。
in_addr addr;
addr.s_addr = inet_addr("192.168.2.103");

char *inet_ntoa(stuct in_addr inaddr);//32位IP->a.b.c.d形式的
//將32位網絡字節序二進制地址轉換成點分十進制的串

a表明ASCIIn表明network

網絡、主機字節序轉換函數

主機序轉換到網絡序:
u_short htons (u_short short);
u_long htonl (u_long  hostlong);

網絡序轉換到主機序:
u_short ntohs (u_short short);
u_long ntohl (u_long hostlong);

h(host),n(network),l(long),s(short)

經過主機名訪問網絡

主機結構體

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地址
struct hostent *gethostbyname(const char *hostname)

socket

通用地址結構:

struct sockaddr
{
    u_short sa_family;//協議族
    char sa_data[14];//地址協議
}

Internet協議地址結構

struct sockaddr_in
{
    short int sin_family;//協議族
    unsigned short int  sin_port;//端口號
    struct in_addr sin_addr;//協議特定地址
    unsigned char si_zero[8];//未使用,填0
}
通常使用與sockaddr等價的sockaddr_in數據結構

IPv4地址結構

struct in_addr
{
    u_long s_addr;
}

建立一個socket

int socket(int domain,    //協議族
                  int type,    //套接字類型
                  int protocol)    //標識位
頭文件:
#include <sys/types.h>
#include <sys/socket.h>

參數的選項:
domain
AF_INET//internet協議
AF_UNIX//unix internal協議
AF_NS//Xerox NS協議
AF_IMPLINK//Interface Message協議
type
SOCK_STREAM//流式socket
SOCK_DGRAM//數據報socket
SOCK_RAW//raw socket
protocol參數一般設置爲0

返回值:
成功返回socket的描述符,
失敗返回-1.
                          

用於綁定IP地址和端口號到socket

int bind(int sockfd,    //由socket調用返回的文件描述符。
               struct sockaddr *my_addr,    //指向sockaddr_in結構的指針,包含server IP的地址和端口號。
               int addrlen);    //sockaddr結構的長度(sizeof(sockaddr_in))。
返回值:
成功0,失敗-1;
                    


設置服務器能處理的最大鏈接要求 

#include <sys/socket.h>
int listen(int sockfd,    //監聽鏈接的socket。
              int bakclog)    //請求排隊的最大長度。

listen()將bind的文件描述符變爲監聽套接字
返回值:
文件描述符或-1;

                             


等待客戶端的socket鏈接請求 

int accept (int sockfd,    //listen後的文件描述符,接收客戶端鏈接的Socket。
                   struct sockaddr *addr,    //接收外來鏈接的地址信息。(若不須要可設置NULL)
                   socklen_t *addrlen);    //addr結構的長度。

返回值:
成功:新鏈接的Socket,(並使用其與客戶進行通信,原Socket繼續接受其它客戶的鏈接)。
失敗:-1

與服務器創建鏈接

int connect(int sockfd,    //socket返回的文件描述符
                     struct sockaddr *serv_addr,    // 服務器端的鏈接信息,.sin_add是服務端地址
                     int addrlen)    //serv_addr的長度
頭文件:
#include <sys/types.h>
#include <sys/socket.h>

返回值:
0或-1;
                           


關閉雙向通道
int close (int sockfd);

int shutdown(int sockfd,
                         int howto)    //SHUT_RD關閉讀終端,SHUT_WR關閉寫終端。

返回值:
成功:0
失敗:-1

接收、發送數據(TCP)
ssize_t recv(int socket, void *buffer, size_t length, int flages);//接收數據 
ssize_t send(int socket, const void *buffer, size_t length, int flags)// 發送數據
頭文件:
#incldue <sys/socket.h>
參數:
socket: 已經鏈接的Socket。
buffer: 指向用於接收數據的緩衝區的指針。
length: 緩衝區的大小(字節)。
flags: MSG_OOB或0(send()還有etc).
返回值:
成功接收或發送的字節數。
失敗返回-1,並設置errno。
recv返回0,鏈接斷開。
                        


接收、發送數據(UDP)
頭文件:
#include < sys/types.h >   
#include < sys/socket.h >

接收遠程主機經指定的socket傳來的數據(接收)
 
ssize_t recvfrom(int sockfd,    //套接字描述符
                        void *buf,    //緩衝區
                        int len,    //可接收數據的最大長度.
                        unsigned int flags,    //通常設0,
                        struct sockaddr *from,    //指定欲傳送的網絡地址
                        socket_t *fromlen);    //結構長度

ssize_t 至關於 int,socket_t 至關於int 。

返回值:
成功則返回接收到的字符數,
失敗返回-1. 


將數據由指定的socket傳給對方主機(發送)

int sendto ( int s ,     // 已建好連線的socket,若是利用UDP協議則不需通過連線操做
                 const void * msg,     //發送緩衝區
                 int len,     // 發送的數據大小
                  unsigned int flags,     //通常設0
                  const  struct sockaddr * to ,     //指定欲傳送的網絡地址
                 int tolen )     //sockaddr的結果長度

返回值
成功則返回實際傳送出去的字符數,
失敗返回-1,並設置errno 。


使用文件描述符的函數處理套接字時的行爲

                             
相關文章
相關標籤/搜索