當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 網(wǎng)絡(luò)編程常用函數(shù)接口
通用結(jié)構(gòu)體:
struct sockaddr {
sa_family_t sa_family; /* unsigned short , 指定了通信協(xié)議家族 */
char sa_data[14];
};
IPV4網(wǎng)絡(luò)通信地址結(jié)構(gòu)體:
struct sockaddr_in {
pa_family_t sin_family;
port_t sin_port;
struct in_addr {
unsigned int s_addr;
}sin_addr;
};
UNIX本地通信地址結(jié)構(gòu)體:
struct sockaddr_un {
sa_family_t sun_family;
char sun_path[108];
};
函數(shù)名:int socket (int domain, int type, int protocl)
功能:打開一個套接字,并返回一個相關(guān)的文件描述符。
返回值:成功,一個新的文件描述符;失敗, -1;
參數(shù)表:
int domain, 通信域:
AF_INET | AF_INET6 | AF_UNIX | AF_PACKET
int type, 套接字類型:
SOCK_STREAM 流式套接字
SOCK_DGRAM 數(shù)據(jù)報(bào)套接字
SOCK_RAW 原始套接字
int protocl, 協(xié)議(在原始套接字中根據(jù)需要選擇使用,流式或數(shù)據(jù)報(bào)套接字中為 0)
函數(shù)名: int bind(int sockfd, const struct sockaddr * addr, socklen_t addrlen);
功能:為一個打開的套接字,綁定一個地址(IP+PORT)。
返回值:成功, 0;失敗, -1;
參數(shù)表:
int sockfd, 通過socket打開并返回的文件描述符。
const struct sockaddr * addr, 通用結(jié)構(gòu)體地址,具體根據(jù)通信域選擇相關(guān)的地址格式。
socklen_t addrlen, 實(shí)際地址結(jié)構(gòu)體的大小。
函數(shù)名: int sendto(int sockfd, void *buff, size_t size, int flag, const struct sockaddr *addr, socklen_t addrlen);
功能:向一個指定的目標(biāo)主機(jī)發(fā)送數(shù)據(jù)包。
返回值:成功,實(shí)際發(fā)送的字節(jié)數(shù);失敗, -1;
參數(shù)表:
int sockfd, 通過socket打開并返回的文件描述符。
void *bufff, 即將發(fā)送的數(shù)據(jù)。
size_t size,數(shù)據(jù)大小。
int flag, 發(fā)送標(biāo)志位(阻塞、非阻塞等,如果無特殊要求則設(shè)置為0)。
const struct sockaddr * addr, 目標(biāo)主機(jī)的地址結(jié)構(gòu)體(IP+PORT)。
socklen_t addrlen, 目標(biāo)主機(jī)地址結(jié)構(gòu)體大小。
函數(shù)名: int recvfrom(int sockfd, void *buff, size_t size, int flag, struct sockaddr *addr, socklen_t *addrlen);
功能:接受一個數(shù)據(jù)包,并帶回?cái)?shù)據(jù)包的來源地址。
返回值:成功,實(shí)際接收的字節(jié)數(shù);失敗, -1;對方關(guān)閉, 0;
參數(shù)表:
int sockfd, 通過socket打開并返回的文件描述符。
void *bufff, 接受數(shù)據(jù)的緩沖區(qū)。
size_t size,緩沖區(qū)大小。
int flag, 接收標(biāo)志位(阻塞、非阻塞等,如果無特殊要求則設(shè)置為0)。
struct sockaddr * addr, 用來保存數(shù)據(jù)源主機(jī)的地址的結(jié)構(gòu)體(IP+PORT)。
socklen_t *addrlen, 期望接收的數(shù)據(jù)源主機(jī)的地址結(jié)構(gòu)體大。ㄔ谑褂们坝捎脩糇约撼跏蓟;一旦該函數(shù)調(diào)用結(jié)束,該變量會被修改為實(shí)際大小。
函數(shù)名: int listen(int sockfd, int backlog);
功能:將一個經(jīng)過bind的套接字置為被動狀態(tài),以便將來使用accept接受新的請求。
返回值:成功, 0;失敗, -1;
參數(shù)表:
int sockfd, 通過socket創(chuàng)建,并通過bind后的套接字描述符。
int backlog, 握手請求隊(duì)列的大值。
函數(shù)名: int accept(int sockfd, struct sockaddr * addr, socklen_t addrlen);
功能:接受一個握手請求,并返回一個新的文件描述符。
返回值:成功,新的文件描述符(用來收發(fā)數(shù)據(jù)的通道);失敗, -1;
參數(shù)表:
int sockfd, 經(jīng)過socket創(chuàng)建,bind后并且listen后的文件描述符。
struct sockaddr *addr, 用來帶回握手請求方的地址結(jié)構(gòu)體。
socklen_t addrlen, 期望接收的對方的地址大小,該值會被修改為實(shí)際大小,調(diào)用者需提前初始化。
函數(shù)名: int select(int nfds, fd_set *rdfds, fd_set *wrfds, fd_set *exceptfds, struct timeval * timval);
功能:在多路IO復(fù)用模型中,負(fù)責(zé)檢測多個文件描述符資源。但沒有資源可操作時,進(jìn)程阻塞;有資源操作時返回可操作的資源個數(shù)。
返回值:成功,資源個數(shù);失敗, -1;超時, 0;
參數(shù)表:
int nfds, 檢測的大描述符值+1.
fd_set *rdfds, 希望監(jiān)測的讀資源描述符集合。
fd_set *wrfds, 希望監(jiān)測的寫資源描述符集合。
fd_set *wrfds, 希望監(jiān)測的其他資源描述符集合。
struct timeval *timval, 超時監(jiān)測,設(shè)定秒+微秒。
select相關(guān)函數(shù):
FD_SET(int fd, fd_set * fds): 將描述加入集合中。
FD_CLR(int fd, fd_set *fds): 將指定描述從集合中移除。
FD_ZERO(fd_set *fds): 清空一個描述符集合。
FD_ISSET(Iint fd, fd_set *fds): 測試一個描述符是否在集合中(測試該描述符資源是否可操作);
其他函數(shù)接口:
int send(int sockfd, const void *buff, size_t size, int flag);
int recv(int sockfd, void *buff, size_t size, int flag);
getpeername(int connfd, struct sockaddr *addr, socklen_t *addrlen);
getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
setsockopt(int level, int optname, const void *optval, socklen_t optlen);
short htons(short );
int htonl(int);
short ntohs(short);
int ntohl(int);