rfcomm层的socket程序编写

导读:
  今天写了个简单的蓝牙server—client传递字符串的程序,并且把server移植到了开发板上,测试通过。能够在测试端输入字符串,并显示在服务端。现在输入超过1200个左右的字符就会出现问题,还不清楚究竟是socket的write大小限制在1000多,还是自己缓冲区的问题,明天去借本书来研究研究。
  利用蓝牙建立连接其实和普通socket编程中建立tcp连接很相似,首先在监听端创建socket,bind,然后listen,accept.在客户端connect就连接上了.之后用read,write进行读写.区别在于建立的socket类型方面有所区别. 客户端的代码:
  #include
  #include
  #include
  #include
  #include
  #include
  int main( int argc , char **argv)
  {
  struct sockaddr_rc addr={0};
  int s,status;
  char *dest,*buf; //="00:11:67:32:61:62";
  if(argc==2)
  {
  dest=argv[1];
  }
  else
  {
  printf("prarm error/n");
  exit(1);
  }
  // a l l o c a t e a s oc k e t
  s=socket(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);
  if(s<0)
  {
  perror("create socket error");
  exit(1);
  }
  // s e t the conne c t ion parameter s (who to connect to )
  addr.rc_family=AF_BLUETOOTH;
  addr.rc_channel=(uint8_t)1;
  str2ba(dest,&addr.rc_bdaddr);
  // connect to s e r v e r
  printf("connectting.../n");
  status=connect(s,(struct sockaddr *)&addr,sizeof(addr));
  // send a message
  if(status==0){
  printf("scuess!/n");
  status=write(s,"hello!",6);
  
  do{
  scanf("%s",buf);
  status=write(s,buf,strlen(buf));
  if(status<0) perror("uh oh");
  }while(strcmp(buf,"goodbye")!=0);
  }
  else
  {
  printf("Failed!/n");
  }
  close(s);
  return 0;
  } 服务端的代码:
  #include
  #include
  #include
  #include
  #include
  #include
  int main (int argc,char **argv)
  {
  struct sockaddr_rc loc_addr ={0},rem_addr={0};
  char buf[1024] ={0};//,*addr;
  int s,client, bytes_read,result;
  int opt = sizeof(rem_addr);
  
  printf("Creating socket.../n");
  s =socket(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);
  if(s<0)
  {
  perror("create socket error");
  exit(1);
  }
  else
  {
  printf("success!/n");
  }
  loc_addr.rc_family=AF_BLUETOOTH;
  loc_addr.rc_bdaddr=*BDADDR_ANY;
  loc_addr.rc_channel=(uint8_t)1;
  
  printf("Binding socket.../n");
  result=bind(s,(struct sockaddr *)&loc_addr, sizeof(loc_addr));
  if(result<0)
  {
  perror("bind socket error:");
  exit(1);
  }
  else
  {
  printf("success!/n");
  }
  
  /*result=ba2str(&loc_addr.rc_bdaddr,addr);
  if(result<0)
  {
  perror("addr convert error");
  exit(1);
  }
  printf("local addr is:%s/n",addr);*/
  printf("Listen... ");
  result=listen(s,1);
  if(result<0)
  {
  printf("error:%d/n:",result);
  perror("listen error:");
  exit(1);
  }
  else
  {
  printf("requested!/n");
  }
  printf("Accepting.../n");
  client= accept(s,(struct sockaddr *)&rem_addr,&opt);
  if(client<0)
  {
  perror("accept error");
  exit(1);
  }
  else
  {
  printf("OK!/n");
  }
  ba2str(&rem_addr.rc_bdaddr,buf);
  fprintf(stderr,"accepted connection from %s /n",buf);
  memset(buf,0,sizeof(buf));
  
  while(1)
  {
  bytes_read = read(client,buf,sizeof(buf));
  if(bytes_read>0){
  printf("received[%s]/n",buf);
  if(strcmp(buf,"goodbye")==0)
  exit(1);
  memset(buf,0,bytes_read);
  }
  }
  close(client);
  close(s);
  return 0 ;
  } str2ba和ba2str俩个函数可以把蓝牙地址和字符串呼唤,十分有用!

本文转自
http://blog.csdn.net/ifq/archive/2006/06/07/779228.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值