我们都知道Android手机是基于Linux系统的,在没有Linux环境,但是想学习socket编程的同学可以在Android手机中试试,利用ndk编译可执行文件在Android手机中运行。不同于动态链接库so,本文首先使用的是可直接运行的bin程序,类似windows的exe文件。

好了,开始编写手机中的客户端服务器程序了!

首先看服务器:

我们新建一个c文件叫serv.c

  1. #include <sys/socket.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/errno.h>
  7. #include <netinet/in.h>
  8. #include <unistd.h>
  9. #include <arpa/inet.h>
  10. #define ERR_EXIT(m) \
  11. do{ \
  12. perror(m); \
  13. exit(EXIT_FAILURE); \
  14. }while(0)
  15. int main(void) {
  16. int listenfd;
  17. struct sockaddr_in servaddr;
  18. memset(&servaddr, 0, sizeof(servaddr));
  19. if ((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  20. ERR_EXIT("socket");
  21. }
  22. servaddr.sin_family = AF_INET;
  23. servaddr.sin_port = htons(5188);
  24. servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //表示本机所有地址
  25. int on = 1;
  26. if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
  27. ERR_EXIT("setsockopt");
  28. }
  29. //我们在socket编程中,如果服务器端使用bind绑定端口,当服务器程序结束时,再次绑定会出现端口被占用的现象,应该使用REUSEADDR方法解决这个问题。
  30. //服务器端尽可能使用REUSEADDR,在绑定前尽可能使用setsockopt来设置REUSEADDR套接字选项,使用REUSEADDR选项可以使得不必等待TIME_WAIT状态消失就可以重启服务器。
  31. if (bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0) {
  32. ERR_EXIT("bind");
  33. }
  34. if ((listen(listenfd, SOMAXCONN)) < 0) {
  35. ERR_EXIT("listen");
  36. }
  37. struct sockaddr_in peeraddr;
  38. socklen_t peerlen = sizeof(peeraddr);
  39. int conn; //主动套接字
  40. if ((conn = accept(listenfd, (struct sockaddr*) &peeraddr, &peerlen)) < 0) {
  41. ERR_EXIT("accept");
  42. }
  43. char recvbuf[1024] = { 0 };
  44. int ret;
  45. while (1) {
  46. memset(recvbuf, 0, sizeof(recvbuf));
  47. ret = read(conn, recvbuf, sizeof(recvbuf));
  48. fputs(recvbuf, stdout);
  49. write(conn, recvbuf, ret);
  50. }
  51. close(conn);
  52. close(listenfd);
  53. }

回射客户端cli.c

  1. #include <sys/socket.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/errno.h>
  7. #include <netinet/in.h>
  8. #include <unistd.h>
  9. #include <arpa/inet.h>
  10. #define ERR_EXIT(m) \
  11. do{ \
  12. perror(m); \
  13. exit(EXIT_FAILURE); \
  14. }while(0)
  15. int main(void) {
  16. int sock;
  17. struct sockaddr_in servaddr;
  18. memset(&servaddr, 0, sizeof(servaddr));
  19. if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  20. ERR_EXIT("socket");
  21. }
  22. servaddr.sin_family = AF_INET;
  23. servaddr.sin_port = htons(5188);
  24. servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  25. if(connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
  26. {
  27. ERR_EXIT("connect");
  28. }
  29. char sendbuf[1024]={0};
  30. char recvbuf[1024]={0};
  31. while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){
  32. write(sock,sendbuf,strlen(sendbuf));
  33. read(sock,recvbuf,sizeof(recvbuf));
  34. fputs(recvbuf,stdout);
  35. memset(sendbuf,0,sizeof(sendbuf));
  36. memset(recvbuf,0,sizeof(recvbuf));
  37. }
  38. close(sock);
  39. return 0;
  40. }

Android.mk文件:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_CFLAGS += -O3 -fvisibility=hidden
  4. LOCAL_MODULE    := serv
  5. LOCAL_C_INCLUDES := $(LOCAL_PATH)
  6. LOCAL_SRC_FILES := \
  7. serv.c  \
  8. LOCAL_LDLIBS :=  -lz -llog -L$(SYSROOT)/usr/lib
  9. cmd-strip = $(TOOLCHAIN_PREFIX)strip $1
  10. include $(BUILD_EXECUTABLE)
  11. #include $(BUILD_SHARED_LIBRARY)
  12. #LOCAL_PATH := $(call my-dir)
  13. include $(CLEAR_VARS)
  14. LOCAL_CFLAGS += -O3 -fvisibility=hidden
  15. LOCAL_MODULE    := cli
  16. LOCAL_C_INCLUDES := $(LOCAL_PATH)
  17. LOCAL_SRC_FILES := \
  18. cli.c   \
  19. LOCAL_LDLIBS :=  -lz -llog -L$(SYSROOT)/usr/lib
  20. cmd-strip = $(TOOLCHAIN_PREFIX)strip $1
  21. include $(BUILD_EXECUTABLE)
  22. #include $(BUILD_SHARED_LIBRARY)

执行ndk-build可以得到编译好的bin,如下如:

  1. adb push cli /data/data/
  2. adb push serv /data/data/

把编译好的cli和serv可执行文件push到手机中

  1. cd /data/data/
  2. chmod 777 serv
  3. chmod 777 cli
  1. ./serv

启动server端

  1. ./cli

启动客户端

可以看到服务器返回来的数据。

http://blog.csdn.net/bupt073114/article/details/43114223

在Android手机上学习socket程序的更多相关文章

  1. 在 Android 手机上运行 Python 程序

  2. xe5 android 手机上使用sqlite [转]

    在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank applicatio ...

  3. 安卓手机上运行 PC-E500 程序

    目录 第1章安卓手机上运行 PC-E500 程序    1 1 PockEmul    1 2 下载    1 3 打包BASIC程序    2 4 配置PC-E500模拟器    5 5 载入e50 ...

  4. 如何在 Android 手机上实现抓包?

    如何在 Android 手机上实现抓包? http://www.zhihu.com/question/20467503 我想知道某个应用究竟在数据提交到哪里,提交了什么.网上的教程太复杂,不想麻烦.有 ...

  5. 在Android手机上获取其它应用的包名及版本

    转载请注明出处:http://blog.csdn.net/jason_src/article/details/37757661 获取Android手机上其它应用的包名及版本方法有非常多,能够通过AAP ...

  6. Android 在Android手机上获取其他应用的包名及版本号

    获取Android手机上其他应用的包名及版本号方法有很多,可以通过AAPT从APK包中直接获取,也可以通过代码在手机上获取.显然,对于产品或者用户来说要获取这些信息,在手机上获取更为简便. 下面我们来 ...

  7. 如何在Android手机上进行自动化测试(下)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本篇教程,你将会了解到: 如何使用Poco对Android原生应用进行测试 Poco支持直接对任何Android原生应 ...

  8. 如何通过wifi在android手机上安装调试应用

    如何通过wifi在android手机上安装调试应用 1. 首先还是要打开手机的usb调试选项,并通过usb线连接手机.2. 然后执行“adb tcpip 5555”,把adb从usb模式切换到tcpi ...

  9. delphi xe5 android 手机上使用sqlite

    本篇我们介绍一下在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank ap ...

随机推荐

  1. 【例题 6-6 UVA - 679】Dropping Balls

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 直接模拟会超时. 根据奇偶的规律.直接判断会往哪里走就好. 每个二叉树的节点.必然是左边和右边走的次数对半分.->奇数左边多一 ...

  2. ORACLE表空间的备份与恢复策略

    转自原文如何进行ORACLE表空间的备份与恢复? 1.切换服务器归档模式,如果已经是归档模式可跳过此步: %sqlplus /nolog (启动sqlplus) SQL> conn / as s ...

  3. Android5.0(Lollipop) BLE蓝牙4.0+浅析code(二)

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/23347612来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Android5.0(L ...

  4. 使用maven进行测试设置断点调试的方法

    在Maven中配置测试插件surefire来进行单元测试,默认情况下,surefire会执行文件名以Test开头或结尾的测试用例,或者是以TestCase结尾的测试用例.               ...

  5. css3-11 如何改变背景图片的大小和位置

    css3-11 如何改变背景图片的大小和位置 一.总结 一句话总结:css3相对css2本身就支持改变背景图片的大小和位置. 1.怎么设置背景不填充padding部分? background-orig ...

  6. 一段代码的疑问(1)——unsigned与signed

    现象: 先来看一段代码: 这段代码的输出结果是: -84 4294967264 分析: xiaoqiang@dev:~/cpp$ g++ -g c212.cc -o temp xiaoqiang@de ...

  7. 【u003】计算概率

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明有n个长度不一的小木棍,这些木棍的长度都是正整数.小明的父亲想和小明做一个游戏.他规定一个整数长度 ...

  8. android生成分享长图而且加入全图水印

    尊重他人的劳动成果.转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/65938021. 本文出自:[gengqiquan的博客] 领导近 ...

  9. Python正則表達式

    Python正則表達式 正則表達式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本号起添加了re 模块,它提供 Perl 风格的正則表達式模式. r ...

  10. matlab 机器学习相关函数、api

    matlab 对数据集的默认组织方式是,X∈Rd×N d:行数,表示特征向量的长度: N:列数,表示样本的数目: 1. 模型.预测.mse % 加载 matlab 内置数据到内存 X = abalon ...