wince 蓝牙发送文件的问题

自由的奴隶 2010-05-05 10:56:49
我的设备做client端,向server端发送文件.首先,用winsock建立一个连接,这步成功了.然后,我读取一个文件
,从文件中一次读一个buffer,用send去发送,第一发送后的返回值是对的,就是实际的buffer的长度,但是这时我发现
server端的连接已经断开了,所以再发送下一个buffer时就出错了,代码如下,大家给看看吧.
//1.Setup connect by client socket.
WSADATA wsd;
WSAStartup (MAKEWORD(1,0), &wsd);

SOCKET client_socket = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (client_socket == INVALID_SOCKET) {
wprintf (L"socket failed, error %d\n", WSAGetLastError ());
return FALSE;
}

SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));

sa.addressFamily = AF_BT;
sa.btAddr = b; //b is a BT_ADDR variable

if (*pServiceClassId)
GetGUID(pServiceClassId, &sa.serviceClassId);
else if (channel)
sa.port = channel & 0xff;
else
{
WSACleanup();
return FALSE;
}


if (connect (client_socket, (SOCKADDR *)&sa, sizeof(sa)))
{
//Perform error handling.
DWORD dwErrorCode;
dwErrorCode = WSAGetLastError();
closesocket (client_socket);
WSACleanup();
return FALSE;
}

//2.Open a file and send it to bt device.
TCHAR szFileName[MAX_PATH]={0};
GetFileName(szFileName);

FILE *fp = _wfopen (szFileName, L"r");
if (fp)
{
for ( ; ; )
{
unsigned char buf[128] = {0};
int c = fread (buf, 1, sizeof(buf), fp);
if (c <= 0)
break;

int x = send (client_socket, (const char *)buf, c, 0);
//就在这里,server端的连接就断开了!!!

if (x == SOCKET_ERROR)
{
DWORD dwErrorCode;
dwErrorCode = WSAGetLastError();
break;
}
if (x != c)
{
//wprintf (L"send returns %d, Error = %d\n", x, WSAGetLastError ());
DWORD dwErrorCode;
dwErrorCode = WSAGetLastError();
break;
}

}
fclose (fp);
}
else
{
closesocket (client_socket);
WSACleanup();
return FALSE;//wprintf (L"Cannot open\n");
}

//3.Close connect.
closesocket(client_socket);
WSACleanup();

return TRUE;
...全文
220 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrdone 2010-10-13
  • 打赏
  • 举报
回复
如果你确定数据是发出去一部分以后失败的,那么你可以考虑下用别的方式~
如果是一包数据都没有发出去的话,怀疑目标蓝牙没有开文件传送服务~
自由的奴隶 2010-06-07
  • 打赏
  • 举报
回复
楼上说的很对啊, 不过《Windows CE6.0 开发者参考(第四版)》这本书我到是没有,有机会找来看看.
现在我已经实现文档的传输了. 不过蓝牙发送 大文档(10M以上) 好像总是失败,不懂为什么...
wengshh 2010-05-21
  • 打赏
  • 举报
回复
你是想做从开发板上发送文件给其他蓝牙设备吧?我估计你之所以那样做是参考了《Windows CE6.0 开发者参考(第四版)》吧。我曾经也这样试过,可以连接但是发不了文件,主要是因为了通讯的双方都要遵守相同的协议。如果你再按那样写个服务端,你会发现你的客户端是可以发送文件的。现在的蓝牙设备主要是采用OBEX发发送文件的,所以你要发送文件的话,得按照obex的固定方式发送文件。网上有很多例子,你可以去看看,相信你现在也做出来啦
自由的奴隶 2010-05-09
  • 打赏
  • 举报
回复
找到方向了,这块要用OBEX来实现。wince下有自带的例子可以参考
gauntf 2010-05-06
  • 打赏
  • 举报
回复
帮顶,为赚分而来,顺便学习学习
老人参 2010-05-05
  • 打赏
  • 举报
回复
帮你顶,

连接之后,是不是应该提供服务,然后再发送数据呀,

你看看蓝牙协议,挺复杂的
FrankBIBI 2010-05-05
  • 打赏
  • 举报
回复
MARK,学习 发送完就断开 ,是不是系统它默认已经发送完了。。
自由的奴隶 2010-05-05
  • 打赏
  • 举报
回复
我觉得发送文件的方式应该和server端接收的方式保持一致才对吧,
可是server端是怎么接收文件的这个在哪里能看到呢?
自由的奴隶 2010-05-05
  • 打赏
  • 举报
回复
我看了wince下的几个sample,也是这样写的.

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧