日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux socket 网络编程 常用头文件

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux socket 网络编程 常用头文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一 三種類型的套接字:
1.流式套接字(SOCKET_STREAM)
提供面向連接的可靠的數據傳輸服務。數據被看作是字節流,無長度限制。例如FTP協議就采用這種。
2.數據報式套接字(SOCKET_DGRAM)
提供無連接的數據傳輸服務,不保證可靠性。
3.原始式套接字(SOCKET_RAW)
該接口允許對較低層次協議,如IP,ICMP直接訪問。

二 基本套接字系統調有有如下一些:
創建套接字: socket()
綁定本機端口: bind()
建立連接: connect(),accept()
偵聽端口: listen()
數據傳輸: send(), recv()
輸入/輸出多路復用: select()
關閉套接只: closesocket()

三 數據類型
struct sockaddr
{
unsigned short sa_family; //地址族, 一般為AF_INET
char sa_data[14]; //14字節的協議地址
}
數據結構sockaddr用做bind、connect、recvfrom、sendto等函數的參數,指明地址信息。
但一般編程中并不直接針對此數據結構操作,而是使用另一個與sockaddr等價的數據結構sockaddr_in
struct sockaddr_in
{
short int sin_family; //地址族
unsigned short int sin_port; //端口號
struct in_addr in_addr; //ip地址
unsigned char sin_zero[8]; //填充

}

可以用C++做個不太準確的假設。
sockaddr是base class
sockaddr_in 等是derived class

如此一來,bind, connect , sendto , recvfrom等函數就可以使用base class
來處理多種不同的derived class了。

但是實際上,這是沒有繼承關系數據結構(C嘛),所以需要強制造型來轉換數據類型。正因為如此,在sendto的時候需要給出len長度,因為不同的sockaddr_xx實現長度并不相同。


四 常用函數
1 socket()
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:
int socket(int domain, int type, int protocol)
domain: 協議類型,一般為AF_INET
type: socket類型
protocol:用來指定socket所使用的傳輸協議編號,通常設為0即可

2 bind()
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd: socket描述符
my_addr:是一個指向包含有本機ip地址和端口號等信息的sockaddr類型的指針
addrlen:常被設為sizeof(struct sockaddr)

3 connect()
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
sockfd: 目的服務器的socket描述符
serv_addr:包含目的機器ip地址和端口號的指針
addrlen:sizeof(struct sockaddr)

4 listen()
頭文件:
#include <sys/socket.h>
函數原型:
int listen(int sockfd, int backlog);
sockfd:socket()系統調用返回的socket描述符
backlog:指定在請求隊列中的最大請求數,進入的連接請求將在隊列中等待accept()它們。

5 accept()
頭文件:
#include <sys/types.h>
#inlcude <sys/socket.h>
函數原型:
int accept(int sockfd, void *addr, int addrlen)
sockfd:是被監聽的socket描述符
addr:通常是一個指向sockaddr_in變量的指針,該變量用來存放提出連接請求服務的主機的信息
addrlen:sizeof(struct sockaddr_in)

6 send()
頭文件:
#include <sys/socket.h>
函數原型:
int send(int sockfd, const void *msg, int len, int flags);
sockfd:用來傳輸數據的socket描述符
msg:要發送數據的指針
flags: 0

7 recv()
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:
int recv(int sockfd, void *buf, int len, unsigned int flags)
sockfd:接收數據的socket描述符
buf:存放數據的緩沖區
len:緩沖的長度
flags:0

8 sendto()
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);


9 recvfrom()
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int fromlen)


10 read() write()
int read(int fd, char *buf, int len)
int write(int fd, char *buf, int len)

11 shutdown()
close(sockfd)
int shutdown(int sockfd, int how)
-----------------------------------

netinet/if_ether.h ether_arp的數據結構

netinet/ether.h 以太禎的網絡字節和ascii字節的轉換,包括ether_ntoa(),ether_aton這樣的函數定義

netinet/ip.h 這個頭文件和linux/ip.h似乎很相似,也有iphdr的數據結構,同時還包括了timestamp結構,我的理解是,linux文件夾下的 ip.h是linux黑客編寫的ip頭文件,而這個則是gnu一開始就定義的頭文件,同時還包括了bsd中的ipheader結構定義。同理的還有該目錄 下的tcp.h等文件

linux/ip.h iphdr的數據結構,以及一些ip層的數據定義,同理的還有tcp.h,udp.h等等

linux/if.h 主要的socket頭文件,似乎修改自unix的if.h,定義了網卡的接口信息的宏,例如IFF_UP.另外有數個重要的interface的數據結構定義,包括ifreq,ifconf,ifmap

linux/if_packet.h 原始數據包的數據結構定義,包括sockaddr_pkt,sockaddr_ll,想接收原始數據包的不能錯過這個文件。同理的還有if_ppp.h,if_tun.h等等

netinet/in.h 這個文件作的事情就多了。端口宏定義,著名ip(比如loopback),結構sockaddr_in,網絡字節轉換(ntoh,hton。。。。)。。。反正太多了,沒事的話就把這個文件加到頭文件包含里吧

netdb.h 文件如其名,包括結構hostent(主機環境),獲得主機的信息的幾個函數(gethostbyname)。似乎這個就是定義主機的各項環境,例如hostname等等

net/bpf.h berkeley的數據包過濾頭文件,想用bpf進行包過濾的要重視一下這個文件

net/ethernet.h 包括幾個以太網的數據結構,ether_addr(mac幀結構),ether_header(以太幀的頭部)

-------------------------------

<sys/types.h> //primitive system data types(包含很多類型重定義,如pid_tint8_t)
<sys/socket.h> //與套接字相關的函數聲明和結構體定義,如socket()bind()connect()struct sockaddr的定義等
<sys/ioctl.h> //I/O控制操作相關的函數聲明,如ioctl()
<stdlib.h> //某些結構體定義和宏定義,如EXIT_FAILUREEXIT_SUCCESS
<netdb.h> //某些結構體定義、宏定義和函數聲明,如struct hostentstruct serventgethostbyname()gethostbyaddr()herror()
<arpa/inet.h> //某些函數聲明,如inet_ntop()inet_ntoa()
<netinet/in.h> //某些結構體聲明、宏定義,如struct sockaddr_inPROTO_ICMPINADDR_ANY

------------------------------

linux下socket編寫常用頭文件 #include <sys/socket.h> //connect,send,recv,setsockopt等
#include <sys/types.h>

#include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons
#include <poll.h> //poll,pollfd
#include <arpa/inet.h> //inet_addr,inet_aton
#include <unistd.h> //read,write
#include <netdb.h> //gethostbyname

#include <error.h> //perror
#include <stdio.h>
#include <errno.h> //errno

#include <string.h> // memset
#include <string>
#include <iostream>

總結

以上是生活随笔為你收集整理的Linux socket 网络编程 常用头文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。