WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData);
4. socket編程算法
int shutdown(int sock, int howto); //Linux int shutdown(SOCKET s, int howto); //Windows
sock 爲須要斷開的套接字,howto 爲斷開方式編程
howto 在 Linux 下有如下取值:#include <netdb.h> struct hostent *gethostbyname(const char *hostname);
成功時返回hostnet結構體指針,失敗時返回NULL指針服務器
struct hostnet { char *h_name; char **h_aliases; int h_addrtype; int h_lenght; char **h_addr_list; }
(2) gethostbyaddr()函數利用IP地址獲取域相關信息網絡
#include <netdb.h> struct hostnet *gethostbyaddr(const char *addr, socklen_t len, int fanily);
成功時返回hostnet結構體變量地址值,失敗時返回NULL指針socket
addr:含有IP地址信息的in_addr結構體指針unsigned short htons(unsigned short); unsigned short ntohs(unsigned short); unsigned long htonl(unsigned long); unsigned long ntohl(unsigned long);
(4) 將字符串信息轉換爲網絡字節序的整數型函數
#include <arpa/inet.h> in_addr_t inet_addr(const char *string);
成功時返回32位大端序整數型值,失敗時返回INADDR_NONEspa
(5) inet_aton()也將字符串形式IP地址轉換位32位網絡字節序整數並返回,只不過該函數利用in_addr結構體,且其使用頻率跟高#include <arpa/inet.h> int inet_aton(const char *string, struct in_addr *addr);
成功時返回1(true),失敗時返回0(false)指針
(6) inet_ntoa()函數能夠把網絡字節序整數型IP地址轉換成字符串形式#include <arpa/inet.h> char *inet_ntoa(struct in_addr adr);
成功時返回轉換的字符串地址值,失敗時返回-1;code
調用完該函數後應當即將字符串信息複製到其餘內存空間,由於,若再次調用inet_ntoa函數,則有可能覆蓋以前保存的字符串信息struct sockaddr_in addr; char *serv_ip = "211.217.168.13"; char *serv_port "9190"; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(serv_ip); addr.sin_port = htons(atoi(serv_port));
利用常數INADDR_ANY分配服務器的IP地址,能夠自動獲取運行服務器端的計算機IP地址對象
addr.sin_addr.s_addr = htonl(INADDR_ANY);getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen); setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)
#include <unistd.h> pid_t fork(void);
父進程:fork函數返回子進程的ID
子進程:fork函數返回0#include <unistd.h> pid_t wait(int *statloc);
->成功時返回終止的子進程ID,失敗時返回-1
子進程終止時傳遞的返回值將保存到statloc所指內存空間,須要用下列宏進行分離#include <sys/wait.h> pid_t waitpid(pid_t pid, int *statloc, int options);
->成功時返回終止的子進程ID,失敗時返回-1
pid 等待終止的目標子進程ID,若傳遞-1,則能夠等待任意子進程終止#include <signal.h> void (*signal(int signal, void (*func)(void)))(int);
->爲了在產生信號時調用,返回以前註冊的函數指針
(6) 利用sigaction函數進行信號處理#include <signal.h> int sugacyion(int signo, const struct sigaction *act, struct sigaction *oldact);
->成功時返回0,失敗時返回-1
經過fork函數複製套接字文件描述符後,同一端口將對應多個套接字,只有這些套接字描述符都終止,才能銷燬套接字#include <unistd.h> int pipe(int filedes[2]);
->成功時返回0,失敗時返回-1
filedes[0]:經過管道接收數據時使用的文件描述符,即管道出口FD_ZERO(fd_set *fdset) FD_SET(int fd, fd_set *fdset) FD_CLR(int fd, fd_set *fdset) FD_ISSET(fint fd, d_set *fdset)
(2) select函數:
#include <sys/select.h> #include <sys/time.h> int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
15.多種I/O函數
(1) 收到MSG_OOB緊急消息時,操着系統將產生SIGURG消息,並調用註冊的信號處理函數fcntl(recv_sock, F_SETOWN, getpid());
上述調用的含義是「將文件描述符recv_sock指向的套接字擁有者(F_SETOWN)改成把getpid函數返回值用做ID的進程
(4) 緊急指針指向緊急消息的下一個位置(偏移量+1),緊急消息的意義在於督促消息處理,而非緊急傳輸形式受限的消息 (5) 調用recv函數的同時傳遞MSG_PEEK可選項,是爲了保證即便不存在待讀取的數據也不會進入阻塞狀態,設置MSG_PEEK選項並調用recv函數時,即便讀取了輸入緩衝的數據也不會刪除,該選項一般與MSG_DONTWAIT合做,用於調用以非阻塞方式驗證待讀取數據存在與否的函數