1. 程式人生 > >linux中各種標頭檔案

linux中各種標頭檔案

sys/types.h:資料型別定義

sys/socket.h:提供socket函式及資料結構

netinet/in.h:定義資料結構sockaddr_in

arpa/inet.h:提供IP地址轉換函式

netdb.h:提供設定及獲取域名的函式

sys/ioctl.h:提供對I/O控制的函式

sys/poll.h:提供socket等待測試機制的函式

其他在網路程式中常見的標頭檔案

unistd.h:提供通用的檔案、目錄、程式及程序操作的函式

errno.h:提供錯誤號errno的定義,用於錯誤處理

fcntl.h:提供對檔案控制的函式

time.h:提供有關時間的函式

crypt.h:提供使用DES加密演算法的加密函式

pwd.h:提供對/etc/passwd檔案訪問的函式

shadow.h:提供對/etc/shadow檔案訪問的函式

pthread.h:提供多執行緒操作的函式

signal.h:提供對訊號操作的函式

sys/wait.h、sys/ipc.h、sys/shm.h:提供程序等待、程序間通訊(IPC)及共享記憶體的函式

建議:在編寫網路程式時,可以直接使用下面標頭檔案程式碼

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <errno.h>

#include <malloc.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/ioctl.h>

#include <stdarg.h>

#include <fcntl.h>

#include <fcntl.h>

涉及到使用者許可權及密碼驗證問題時加入如下語句:

#include <shadow.h>

#include <crypt.h>

#include <pwd.h>

需要注意的是,應該在編譯時連結加密演算法庫,即增加編譯選項:

-lcrypt

涉及到檔案及時間操作加入如下語句:

#include <sys/time.h>

#include <utime.h>

#include <time.h>

#include <sys/stat.h>

#include <sys/file.h>

涉及到多程序操作時加入如下語句:

#include <sys/wait.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <signal.h>

涉及到多執行緒操作時加入如下語句:

#include <pthread.h>

#include <sys/poll.h>

需要注意的是,應該在編譯時連結執行緒庫,即增加編譯選項:

-lthread

socket程式設計常用函式

struct sockadd {

unsigned short sa_family;

char sa_data[14];

}

用於bind,connect, recvfrom, sendto

struct sockaddr_in {

short int sin_family;  //AF_INET

unsigned short int sin_port; //網路位元組順序

struct in_addr sin_addr;   //struct in_addr { unsigned long s_addr; }

unsigned char sin_zero[8];

}

sample:

struct sockaddr_in sa;

sa.sin_family  = AF_INET;

sa.sin_port = htons(3490);

sa.sin_addr.s_addr = inet_addr(”132.241.5.10″);

baero(&(sa.sin_zero),8);

轉換函式:

unsigned long inet_addr(const char *cp);

char* inet_ntoa(strct in_addr in);

位元組順序轉換:

htons()——-Host to network short

htonl()——–Host to network long

ntohs()——-Network to host short

ntohl()——–Network to host long

取得本地主機名

int gethostname (char *hostname, size_tsize);

取得本地資訊

int getsockname(int sockfd, struct sockaddr* addr, int * addrlen);

例如:

struct sockaddr_in sa;

int len=sizeof(sa);

getpeername(sockfd, (structsockaddr*)&sa, &len);

printf(”local IP:%s”,inet_ntoa(sa.sin_addr.s_addr));

獲得DNS資訊

struct hostent * gethostbyname(const char*name);

struct hostent*  gethostbyaddr(const char* addr, int len, inttype);

讀取或改變socker屬性

int getsockopt(int sockfd, int level, intname, char* value, int* optlen);

int setsockopt(…….);

對於socket程式設計:level一般為SOL_SOCKET

常用:

SO_RCVTIMEO, SO_SNDTIMEO

SO_SNDBUF, SO_RCVBUF: buffer size

…..

網路連線

int socker(int domain, int type, intprotocol);

return -1 means error

domain : AF_INET

protocol: 一般0

TCP: sockfd = socket(AF_INET, SOCK_STREAM,0);

UDP: sockfd = socket(AF_INET, SOCK_DGRAM,0);

繫結埠

int bind(int sockfd, struct sockaddr *sa,int addrlen);

連線網路(TCP)

int connect(int sockfd, struct sockaddr*servaddr, int addrlen);

監聽埠(TCP)

int listen(int sockfd, int queue_length);

響應連線請求(TCP)

int accept(int sockfd, struct sockaddr*addr, int *addrlen);

關閉

int close(int sockfd);

int shutdown(int sockfd, int how);

0—-禁接收

1—禁傳送

2—進收發

輪詢

int select(int numfds, fd_set *readfds,fd_set * writefds,  fd_set * exceptfds,struct timeval* timeout);

注意windows和unix中,函式返回後fd_set內容發生了改變,下次使用必須重新賦值。

接收和傳送:

TCP: int send(int s, const void* buf, intlen, int flags);

int recv(….);

UDP: int sendto(int s, const void* buf, intlen, int flags, const struct sockaddr* to, int tolen);

int recvfrom(…);

基於訊息的方式:

int sendmsg(int s, const struct msghdr *msg, int flags);

int recvmsg(…);