htonl(將32位主機字符順序轉換成網絡字符順序)
相關函數 htons,ntohl,ntohs
表頭文件 #include<netinet/in.h>
定義函數 unsigned long int htonl(unsigned long int hostlong);
函數說明 htonl()用來將參數指定的32位hostlong 轉換成網絡字符順序。
返回值 返回對應的網絡字符順序。
范例 參考getservbyport()或connect()。
htons(將16位主機字符順序轉換成網絡字符順序)
相關函數 htonl,ntohl,ntohs
表頭文件 #include<netinet/in.h>
定義函數 unsigned short int htons(unsigned short int hostshort);
函數說明 htons()用來將參數指定的16位hostshort轉換成網絡字符順序。
返回值 返回對應的網絡字符順序。
范例 參考connect()。
inet_addr(將網絡地址轉成二進制的數字)
相關函數 inet_aton,inet_ntoa
表頭文件 #include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定義函數 unsigned long int inet_addr(const char *cp);
函數說明 inet_addr()用來將參數cp所指的網絡地址字符串轉換成網絡所使用的二進制數字。網絡地址字符串是以數字和點組成的字符串,例如:“163.13.132.68”。
返回值 成功則返回對應的網絡二進制的數字,失敗返回-1。
inet_aton(將網絡地址轉成網絡二進制的數字)
相關函數 inet_addr,inet_ntoa
表頭文件 #include<sys/scoket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定義函數 int inet_aton(const char * cp,struct in_addr *inp);
函數說明 inet_aton()用來將參數cp所指的網絡地址字符串轉換成網絡使用的二進制的數字,然後存於參數inp所指的in_addr結構中。
結構in_addr定義如下
struct in_addr
{
unsigned long int s_addr;
};
返回值 成功則返回非0值,失敗則返回0。
inet_ntoa(將網絡二進制的數字轉換成網絡地址)
相關函數 inet_addr,inet_aton
表頭文件 #include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定義函數 char * inet_ntoa(struct in_addr in);
函數說明 inet_ntoa()用來將參數in所指的網絡二進制的數字轉換成網絡地址,然後將指向此網絡地址字符串的指針返回。
返回值 成功則返回字符串指針,失敗則返回NULL。
listen(等待連接)
相關函數 socket,bind,accept,connect
表頭文件 #include<sys/socket.h>
定義函數 int listen(int s,int backlog);
函數說明 listen()用來等待參數s 的socket連線。參數backlog指定同時能處理的最大連接要求,如果連接數目達此上限則client端將收到ECONNREFUSED的錯誤。 Listen()並未開始接收連線,只是設置socket為listen模式,真正接收client端連線的是accept()。通常listen()會在socket(),bind()之後調用,接著才調用accept()。
返回值 成功則返回0,失敗返回-1,錯誤原因存於errno
附加說明 listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數backlog 最大值可設至128。
錯誤代碼 EBADF 參數sockfd非合法socket處理代碼
EACCESS 權限不足
EOPNOTSUPP 指定的socket並未支援listen模式。
范例 #include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 1234
#define MAXSOCKFD 10
main()
{
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
fd_set readfds;
char buffer[256];
char msg[ ] =”Welcome to server!”;
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,&addr,sizeof(addr))<0){
perror(“connect”);
exit(1);
}
if(listen(sockfd,3)<0){
perror(“listen”);
exit(1);
}
for(fd=0;fd<MAXSOCKFD;fd++)
is_connected[fd]=0;
while(1){
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
for(fd=0;fd<MAXSOCKFD;fd++)
if(is_connected[fd]) FD_SET(fd,&readfds);
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;
for(fd=0;fd<MAXSOCKFD;fd++)
if(FD_ISSET(fd,&readfds)){
if(sockfd = =fd){
if((newsockfd = accept (sockfd,&addr,&addr_len))<0)
perror(“accept”);
write(newsockfd,msg,sizeof(msg));
is_connected[newsockfd] =1;
printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr));
}else{
bzero(buffer,sizeof(buffer));
if(read(fd,buffer,sizeof(buffer))<=0){
printf(“connect closed.\n”);
is_connected[fd]=0;
close(fd);
}else
printf(“%s”,buffer);
}
}
}
}
執行 $ ./listen
connect from 127.0.0.1
hi I am client
connected closed.
ntohl(將32位網絡字符順序轉換成主機字符順序)
相關函數 htonl,htons,ntohs
表頭文件 #include<netinet/in.h>
定義函數 unsigned long int ntohl(unsigned long int netlong);
函數說明 ntohl()用來將參數指定的32位netlong轉換成主機字符順序。
返回值 返回對應的主機字符順序。
范例 參考getservent()。