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(…);