本帖最后由 code404 于 2013-10-25 14:58:09 编辑

解决方案 »

  1.   

    我最近也有想法想做一套你说的这种方案,但是LZ,我很好奇如果服务器是做为手机APP的话,那客户端如何找到这个并不是固定IP的server呢。
      

  2.   

    如果是局域网倒是可以,如果是GPRS什么的,IP无法固定住。
    局域网内可以设定一个固定的IP地址。
    用dll作为socket客户端去连接 Android Service这个倒是少见。
      

  3.   

    1.如果你走移动业务,2G,3G,GPRS神马的,那是通过基站分配的ip,无法控制。如果用wifi倒应该可以,将路由设好,就是不知道wifi和有线之间是否是局域网,可以试试。
    2.手机本身一般就做为客户端应用的,你非要把server放在手机上我有点搞不懂。你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了。很好奇楼主真实的需求到底是什么。
      

  4.   

    server放手机,其他的设备要向手机发起通信请求,然后发送命令,手机端接收命令,返回命令的应答。另外,我不知道您所说的“你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了”的隐含意思是?那我想请教一下,两个设备间不借助wifi和2g、3g之类的网络,仅通过连接两者间的数据线,那么两者应该如何通信呢?
      

  5.   

    server放手机,其他的设备要向手机发起通信请求,然后发送命令,手机端接收命令,返回命令的应答。另外,我不知道您所说的“你既然说你用数据线,那都用数据线连设备了,还用什么socket啊,这不多此一举了”的隐含意思是?那我想请教一下,两个设备间不借助wifi和2g、3g之类的网络,仅通过连接两者间的数据线,那么两者应该如何通信呢?
    呵呵,晓得了。你要有这种需求的话确实有server的角色了!
      

  6.   

    问题解决了. 包括两个头文件和一个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.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);