#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 。
使用文件描述符的函數處理套接字時的行為