rendered paste body#include "BTSocket.h"#include <fcntl.h>#include <errno.h>BTSocketServer::BTSocketServer(int channel){// uint8_t channel; /**< RFCOMM channel */ int l_channel; /**< RFCOMM channel */ uint32_t handle; /**< handle of sdp record */ bdaddr_t bdaddr_local; name = "[SDCP]Linux-Server"; bacpy(&bdaddr_local,BDADDR_ANY); sdp = new mysdp(); bacpy(&sdp->bdaddr_local,&bdaddr_local); sockaddr_rc loc_addr; char *c_name; c_name = (char *)malloc(name.size()+1); strcpy(c_name,name.c_str()); sdp->sdp_clean(c_name);// channel = sdp->sdp_free_channel();// channel = 5; l_channel = channel; printf("channel set to: %d\n", l_channel); sdp->sdp_register(c_name,channel,&handle); sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); fcntl(sock, F_SETFD, fcntl(sock, F_GETFD) | FD_CLOEXEC); fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);/* int reuse = 1; // set SO_REUSEADDR if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) { perror("setting SO_REUSEADDR"); close(sock); return; } */ loc_addr.rc_family = AF_BLUETOOTH; loc_addr.rc_channel = l_channel; bacpy(&loc_addr.rc_bdaddr, &bdaddr_local); bind(sock, (struct sockaddr *)&loc_addr, sizeof(loc_addr)); int opt; opt = 0; opt |= RFCOMM_LM_MASTER; setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)); listen(sock, 5); free(c_name); }BTSocketServer::~BTSocketServer(){ char *c_name = (char *)malloc(name.size()+1); strcpy(c_name,name.c_str()); sdp->sdp_clean(c_name); if(sock > 0) close(sock); sdp->sdp_clean_all();}int BTSocketServer::getSocket(){ return sock;}int BTSocketServer::connect(){ return 0;}BTSocketClient::BTSocketClient(string address, int channel){ sock = -1; sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); if(sock < 0) { sock = -1; return; } /* addr.rc_family = AF_BLUETOOTH;//TODO bacpy(&addr.rc_bdaddr, src); addr.rc_channel = 0; if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { sock = -1; return; }*/ /* Bind to local address */ struct sockaddr_rc addr; memset(&addr, 0, sizeof(addr)); addr.rc_family = AF_BLUETOOTH; bacpy(&addr.rc_bdaddr, BDADDR_ANY); if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("Can't bind socket"); close(sock); sock = -1; return; } fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK); bacpy(&this->address, strtoba(address.c_str())); this->channel = channel;}BTSocketClient::~BTSocketClient(){ if(sock > 0) close(sock);} int BTSocketClient::connect(){ int rc, errno; struct sockaddr_rc addr; addr.rc_family = AF_BLUETOOTH; bacpy(&addr.rc_bdaddr, &address); addr.rc_channel = channel; rc = ::connect(sock, (struct sockaddr *)&addr, sizeof(addr)); if((rc == -1) && (errno == EINPROGRESS)) return 1; else if(rc == -1) { close(sock); sock = -1; return -1; } else return 0;}int BTSocketClient::getSocket(){ return sock;}