为最终实现android与VC++6.0的通信,逐步进行多个实验,这里是第一个。
希望能找到同做这个方向的同仁一起讨论
java下的UDP、TCP通信参照
http://blog.youkuaiyun.com/wintys/article/details/3525619
java下代码:
public class UDPSend {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket client=new DatagramSocket();
String sendStr="Hello! I'm Client!";
byte[] sendBuf;
sendBuf=sendStr.getBytes();
InetAddress addr=InetAddress.getByName("192.168.1.100");
int port=8888;
DatagramPacket sendPacket=new DatagramPacket(sendBuf,sendBuf.length,addr,port);
client.send(sendPacket);
byte[] recvBuf=new byte[100];
DatagramPacket recvPacket=new DatagramPacket(recvBuf,recvBuf.length);
client.receive(recvPacket);
String recvStr=new String(recvPacket.getData(),0,recvPacket.getLength());
System.out.println("------收到:"+recvStr);
client.close();
}
}
VC++下代码:
#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
void main()
{
WSADATA wsaData;
WORD wVersonRequested;
int err;
wVersonRequested = MAKEWORD(2, 2); //SOCKET 版本信息
err = WSAStartup(wVersonRequested, &wsaData);
if(err != 0)
{
printf("WINDOWS SOCKET2.2初始化失败!\n");
return;
}
SOCKET sock= socket(AF_INET, SOCK_DGRAM, 0); //创建套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
bind(sock, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //绑定本地IP和端口号
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
/*循环接收*/
while(1){
char recvBuf[1024]={0};
sprintf(recvBuf, "%s\nReceived from IP: %s!\n", recvBuf, inet_ntoa(addrClient.sin_addr));
printf("%s", recvBuf);
}
closesocket(sock);
WSACleanup();
}
VC++可以成功接收到Hello! I'm Client!,并解析出发送端的IP地址
当使用android与VC++通信时,核心代码基本不变,唯一要注意的就是要在android工程的manifest中添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
另外一些常用的权限见http://my.oschina.net/javagg/blog/17071