recvfrom

功能: 
  recvfrom函数(经socket接收数据):
  函数原型:ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); ssize_t 相当于 int,socket_t 相当于int ,这里用这个名字为的是提高代码的自说明性。
  参数:
  s:标识一个已连接 套接口的描述字。 
  buf:接收 数据缓冲区。 
  len:缓冲区长度。 
  flags:调用操作方式。 
  from:(可选) 指针,指向装有源地址的缓冲区。 
  fromlen:(可选)指针,指向from缓冲区长度值。
  返回值:
  如果正确接收返回接收到的字节数,失败返回0.
  相关函数 recv,recvmsg,send,sendto,socket
  函数说明: recvfrom()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的 网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.
  返回值:成功则返回接收到的字符数,失败返回-1.
   错误代码
  EBADF 参数s非合法的socket处理代码
  EFAULT 参数中有一指针指向无法存取的内存空间。
  ENOTSOCK 参数s为一 文件描述词,非socket。
  EINTR 被信号所中断。
  EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。
  ENOBUFS 系统的缓冲内存不足
  ENOMEM 核心内存不足
  EINVAL 传给 系统调用的参数不正确。
  范例
  /*利用socket的UDP client
  此程序会连线UDP server,并将键盘输入的字符串传给server。
  UDP server 范例请参考sendto()。
  */
  #include<sys/stat.h>
  #include<fcntl.h>
  #include<unistd.h>
  #include<sys/typs.h>
  #include<sys/socket.h>
  #include<netinet/in.h>
  #include<arpa/inet.h>
  #define PORT 2345
  #define SERVER_IP “ 127.0.0.1
  main()
  {
  int s,len;
  struct sockaddr_in addr;
  int addr_len =sizeof(struct sockaddr_in);
  char buffer[256];
  /* 建立socket*/
  if((s = socket( AF_INET,SOCK_DGRAM,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);
  while(1){
  bzero(buffer,sizeof(buffer));
  /* 从标准输入设备取得字符串*/
  len =read(STDIN_FILENO,buffer,sizeof(buffer));
  /* 将字符串传送给server端*/
  sendto(s,buffer,len,0,(struct sockaddr *)&addr,addr_len);
  /* 接收server端返回的字符串*/
  len = recvfrom(s,buffer,sizeof(buffer),0,(struct sockaddr *)&addr,&addr_len);
  printf(“receive: %s”,buffer);
  }
  }
  执行 (先执行udp server 再执行udp client)
  hello /*从键盘输入字符串*/
  receive: hello /*server端返回来的字符串*/
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值