歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix基礎知識

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

#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代表ASCII,n代表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;

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

等待客戶端的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 。

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

Copyright © Linux教程網 All Rights Reserved