编写一个和Android进行Socket通信的dll客户端 本帖最后由 code404 于 2013-10-25 14:58:09 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我最近也有想法想做一套你说的这种方案,但是LZ,我很好奇如果服务器是做为手机APP的话,那客户端如何找到这个并不是固定IP的server呢。 如果是局域网倒是可以,如果是GPRS什么的,IP无法固定住。局域网内可以设定一个固定的IP地址。用dll作为socket客户端去连接 Android Service这个倒是少见。 1.如果你走移动业务,2G,3G,GPRS神马的,那是通过基站分配的ip,无法控制。如果用wifi倒应该可以,将路由设好,就是不知道wifi和有线之间是否是局域网,可以试试。2.手机本身一般就做为客户端应用的,你非要把server放在手机上我有点搞不懂。你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了。很好奇楼主真实的需求到底是什么。 server放手机,其他的设备要向手机发起通信请求,然后发送命令,手机端接收命令,返回命令的应答。另外,我不知道您所说的“你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了”的隐含意思是?那我想请教一下,两个设备间不借助wifi和2g、3g之类的网络,仅通过连接两者间的数据线,那么两者应该如何通信呢? server放手机,其他的设备要向手机发起通信请求,然后发送命令,手机端接收命令,返回命令的应答。另外,我不知道您所说的“你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了”的隐含意思是?那我想请教一下,两个设备间不借助wifi和2g、3g之类的网络,仅通过连接两者间的数据线,那么两者应该如何通信呢?呵呵,晓得了。你要有这种需求的话确实有server的角色了! 问题解决了. 包括两个头文件和一个cpp文件,编译会生成一个dll文件,接下来写一个调用这个dll的工程就ok了.PS:其中一些代码是引用网上的InitSock.h// initsock.h文件#include <winsock2.h>#include <stdlib.h> #include <conio.h> #include <stdio.h> #pragma comment(lib, "WS2_32") // 链接到WS2_32.libclass CInitSock {public: CInitSock(BYTE minorVer = 2, BYTE majorVer = 2) { // 初始化WS2_32.dll WSADATA wsaData; WORD sockVersion = MAKEWORD(minorVer, majorVer); if(::WSAStartup(sockVersion, &wsaData) != 0) { exit(0); } } ~CInitSock() { ::WSACleanup(); }};SocketDll.h#pragma once #define DLL_EXPORT __declspec(dllexport) extern "C" DLL_EXPORT void startSocket(); SocketDll.cpp#include "InitSock.h"#include <stdio.h>#include <iostream> #include <process.h>using namespace std;CInitSock initSock; // 初始化Winsock库#include "SocketDll.h" void startSocket() { // 端口映射 system("adb forward tcp:8081 tcp:10086"); // 创建套节字 SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == INVALID_SOCKET) { printf(" Failed socket() /n"); return; } // 填写远程地址信息 sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(8081); // 设定ip servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) { printf(" Failed connect() /n"); return; } else { cout << "连接成功!" << endl; } char buff[256]; char szText[256] ; while(TRUE) { // 向服务器端发送数据 cin>>szText ; szText[255] = '/0'; ::send(s, szText, strlen(szText), 0) ; //从服务器端接收数据 int nRecv = ::recv(s, buff, 256, 0); if(nRecv > 0) { buff[nRecv] = '/0'; printf("接收到数据:%s/n", buff); } } // 关闭套节字 ::closesocket(s); } Android inflate 与 AsyncTask 问题 NDK gdb设置断点的时候总是显示No line * in file..... Android触摸屏和按键处理代码 listView中ListItem Pressed的问题 如何给png图片描边 怎样列出/data/data/mypackage/files目录下的文件结构 求助 图中的效果如何实现?? 求助:如何实现这种画图?? android静默卸载怎么实现? 在AVD运行时,惠普笔记本改BIOS怎么弄 如何有效地管理应用中的多个activity android 为什么用managedQuery也会报这个问题呢:
局域网内可以设定一个固定的IP地址。
用dll作为socket客户端去连接 Android Service这个倒是少见。
2.手机本身一般就做为客户端应用的,你非要把server放在手机上我有点搞不懂。你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了。很好奇楼主真实的需求到底是什么。
呵呵,晓得了。你要有这种需求的话确实有server的角色了!
PS:其中一些代码是引用网上的
InitSock.h// initsock.h文件
#include <winsock2.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(::WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
SocketDll.h#pragma once
#define DLL_EXPORT __declspec(dllexport)
extern "C" DLL_EXPORT void startSocket();
SocketDll.cpp#include "InitSock.h"
#include <stdio.h>
#include <iostream>
#include <process.h>
using namespace std;CInitSock initSock; // 初始化Winsock库#include "SocketDll.h"
void startSocket()
{
// 端口映射
system("adb forward tcp:8081 tcp:10086"); // 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
printf(" Failed socket() /n");
return;
}
// 填写远程地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8081); // 设定ip
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
{
printf(" Failed connect() /n");
return;
} else {
cout << "连接成功!" << endl;
}
char buff[256];
char szText[256] ;
while(TRUE)
{
// 向服务器端发送数据
cin>>szText ;
szText[255] = '/0';
::send(s, szText, strlen(szText), 0) ; //从服务器端接收数据
int nRecv = ::recv(s, buff, 256, 0);
if(nRecv > 0)
{
buff[nRecv] = '/0';
printf("接收到数据:%s/n", buff);
}
}
// 关闭套节字
::closesocket(s);
}