我们都知道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. 基于phonegap开发app的实践

    app开发告一段落.期间遇到不少问题,写篇文章记录一下. 为虾米要用phonegap 开发app,至少要考虑android和ios两个版本号吧,android偶能够应付,ios表示全然木有接触过.于是 ...

  2. 0、驱动及应用小技巧、uboot指令及环境变量配置、linux常用命令

    (内核make menuconfig之后,通过insmod安装的驱动都应该重新make,可能会出现一些莫名的问题) (nor flash/SDRAM/DM9000都受内存控制器控制,需要配置内存控制器 ...

  3. SIP对话、事务详解

    1,SIP对话的建立(图片来自于网络) SIP对话的建立包括invite request,response,ACK.其中response包含临时响应(1XX response)和最终响应(非1XX r ...

  4. linux下实现监控进程网络带宽

    嗯,近期都在网易游戏实习,所以貌似有段时间没有上来写点东西了... 来网易游戏实习最基本的目的事实上就是想知道在游戏公司里面工作都是些什么内容,毕竟自己曾经也没有接触过游戏公司.. 还比較的好奇.. ...

  5. 魔兽争霸war3心得体会(二):狗转蜘蛛,DK光环+游侠二发

    最近几周,勤奋地在QQ对战平台上,练习war3对战. 10年玩到14年初, 也玩了很多,主要是抱着"随便玩玩"的心态,结果也很显然,可以轻松打赢中等电脑,以及AI不够高的发狂的Hu ...

  6. Node.js日志框架选型比較:Bunyan

    前一篇Node.js日志框架选型比較:Winston Bunyan Bunyan(by Trent Mick)是另外一个值得考虑的日志框架,以稍微不同的方式处理结构化,机器可读性被重点对待. 其结果是 ...

  7. jquery-11 留言板如何实现

    jquery-11 留言板如何实现 一.总结 一句话总结:用live()方法让后面动态添加的元素也绑定之前对应类绑定的方法. 1.如何让后面动态添加的元素也绑定之前对应类绑定的方法? 用live()方 ...

  8. Call to a member function assign() on a non-object;thinkphp中报错

    这个在自己写的类中 需要function __construct(){parent::__construct();}继承父类构造函数 当发生这个错误的时候,需要在构造函数中集成父类构造

  9. centos7安装nginx的两种方法

    第一种方式:通过yum安装 直接通过 yum install nginx 肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中 运行下面的命令: 1.将nginx放到y ...

  10. html中的span有value属性么(可以作为自定义属性在jquery中用)

    html中的span有value属性么(可以作为自定义属性在jquery中用) 一.总结 可以作为自定义属性在jquery中用 二.html中的span有value属性么 value并不是span标签 ...