linux常用c函数接口处理篇

来源:Linux认证    发布时间:2012-11-10    Linux认证视频    评论

  accept(接受socket连线)

  相关函数  socket,bind,listen,connect

  表头文件  #include<sys/types.h>

  #include<sys/socket.h>

  定义函数  int accept(int s,struct sockaddr * addr,int * addrlen);

  函数说明  accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时 accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用 accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。

  返回值  成功则返回新的socket处理代码,失败返回-1,错误原因存于errno中。

  错误代码  EBADF 参数s 非合法socket处理代码。

  EFAULT 参数addr指针指向无法存取的内存空间。

  ENOTSOCK 参数s为一文件描述词,非socket。

  EOPNOTSUPP 指定的socket并非SOCK_STREAM。

  EPERM 防火墙拒绝此连线。

  ENOBUFS 系统的缓冲内存不足。

  ENOMEM 核心内存不足。

  范例  参考listen()。

  bind(对socket定位)

  相关函数  socket,accept,connect,listen

  表头文件  #include<sys/types.h>

  #include<sys/socket.h>

  定义函数  int bind(int sockfd,struct sockaddr * my_addr,int addrlen);

  函数说明  bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构

  struct sockaddr

  {

  unsigned short int sa_family;

  char sa_data[14];

  };

  sa_family 为调用socket()时的domain参数,即AF_xxxx值。

  sa_data 最多使用14个字符长度。

  此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET domain,其socketaddr结构定义便为

  struct socketaddr_in

  {

  unsigned short int sin_family;

  uint16_t sin_port;

  struct in_addr sin_addr;

  unsigned char sin_zero[8];

  };

  struct in_addr

  {

  uint32_t s_addr;

  };

  sin_family 即为sa_family

  sin_port 为使用的port编号

  sin_addr.s_addr 为IP 地址

  sin_zero 未使用。

  参数  addrlen为sockaddr的结构长度。

  返回值  成功则返回0,失败返回-1,错误原因存于errno中。

  错误代码  EBADF 参数sockfd 非合法socket处理代码。

  EACCESS 权限不足

  ENOTSOCK 参数sockfd为一文件描述词,非socket。

  范例  参考listen()

  connect(建立socket连线)

  相关函数  socket,bind,listen

  表头文件  #include<sys/types.h>

  #include<sys/socket.h>

  定义函数  int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

  函数说明  connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。

  返回值  成功则返回0,失败返回-1,错误原因存于errno中。

  错误代码  EBADF 参数sockfd 非合法socket处理代码

  EFAULT 参数serv_addr指针指向无法存取的内存空间

  ENOTSOCK 参数sockfd为一文件描述词,非socket。

  EISCONN 参数sockfd的socket已是连线状态

  ECONNREFUSED 连线要求被server端拒绝。

  ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。

  ENETUNREACH 无法传送数据包至指定的主机。

  EAFNOSUPPORT sockaddr结构的sa_family不正确。

  EALREADY socket为不可阻断且先前的连线操作还未完成。

  范例  /* 利用socket的TCP client

  此程序会连线TCP server,并将键盘输入的字符串传送给server。

  TCP server范例请参考listen()。

  */

  #include<sys/stat.h>

  #include<fcntl.h>

  #include<unistd.h>

  #include<sys/types.h>

  #include<sys/socket.h>

  #include<netinet/in.h>

  #include<arpa/inet.h>

  #define PORT 1234

  #define SERVER_IP “127.0.0.1”

  main()

  {

  int s;

  struct sockaddr_in addr;

  char buffer[256];

  if((s = socket(AF_INET,SOCK_STREAM,0))<0){

  perror(“socket”);

  exit(1);

  }

  /* 填写sockaddr_in结构*/

  bzero(&addr,sizeof(addr));

  addr.sin_family = AF_INET;

  addr.sin_port=htons(PORT);

  addr.sin_addr.s_addr = inet_addr(SERVER_IP);

  /* 尝试连线*/

  if(connect(s,&addr,sizeof(addr))<0){

  perror(“connect”);

  exit(1);

  }

  /* 接收由server端传来的信息*/

  recv(s,buffer,sizeof(buffer),0);

  printf(“%s/n”,buffer);

  while(1){

  bzero(buffer,sizeof(buffer));

  /* 从标准输入设备取得字符串*/

  read(STDIN_FILENO,buffer,sizeof(buffer));

  /* 将字符串传给server端*/

  if(send(s,buffer,sizeof(buffer),0)<0){

  perror(“send”);

  exit(1);

  }

  }

  }

  执行  $ ./connect

  Welcome to server!

  hi I am client! /*键盘输入*/

  /*<Ctrl+C>中断程序*/

  endprotoent(结束网络协议数据的读取)

  相关函数  getprotoent,getprotobyname,getprotobynumber,setprotoent

  表头文件  #include<netdb.h>

  定义函数  void endprotoent(void);

  函数说明  endprotoent()用来关闭由getprotoent()打开的文件。

  返回值

  范例  参考getprotoent()

  endservent(结束网络服务数据的读取)

  相关函数  getservent,getservbyname,getservbyport,setservent

  表头文件  #include<netdb.h>

  定义函数  void endservent(void);

  函数说明  endservent()用来关闭由getservent()所打开的文件。

  返回值

  范例  参考getservent()。

  getsockopt(取得socket状态)

  相关函数  setsockopt

  表头文件  #include<sys/types.h>

  #include<sys/socket.h>

  定义函数  int getsockopt(int s,int level,int optname,void* optval,socklen_t* optlen);

  函数说明  getsockopt()会将参数s所指定的socket状态返回。参数optname代表欲取得何种选项状态,而参数optval则指向欲保存结果的内存地址,参数optlen则为该空间的大小。参数level、optname请参考setsockopt()。

  返回值  成功则返回0,若有错误则返回-1,错误原因存于errno

  错误代码  EBADF 参数s 并非合法的socket处理代码

  ENOTSOCK 参数s为一文件描述词,非socket

  ENOPROTOOPT 参数optname指定的选项不正确

  EFAULT 参数optval指针指向无法存取的内存空间

  范例  #include<sys/types.h>

  #include<sys/socket.h>

  main()

  {

  int s,optval,optlen = sizeof(int);

  if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”);

  getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);

  printf(“optval = %d/n”,optval);

  close(s);}

  执行  optval = 1 /*SOCK_STREAM的定义正是此值*/

上一页1234下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答