歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> linux常用c函數:接口處理篇(二)

linux常用c函數:接口處理篇(二)

日期:2017/2/25 10:38:46   编辑:Linux教程

  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()。

Copyright © Linux教程網 All Rights Reserved