我们都知道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. hive SQL优化之distribute by和sort by

    近期在优化hiveSQL. 以下是一段排序,分组后取每组第一行记录的SQL INSERT OVERWRITE TABLE t_wa_funnel_distinct_temp PARTITION (pt ...

  2. [spark]spark 编程教程

      参考: 英文:https://spark.apache.org/docs/latest/programming-guide.html 中文:http://www.cnblogs.com/lujin ...

  3. 【例题5-3 UVA - 10815】Andy's First Dictionary

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用stringstream来处理中间的标点. ->直接把他变成一个空格. 然后重新输入进去. set默认的字典序就是升序的了. ...

  4. Windows7-32位系统下R语言链接mySQL数据库步骤

    安装R和MySQL在此就不再多说了.网上有非常多教程能够找到.以下直接进入到odbc的安装流程. 1.下载安装mysql-connector-odbc-5.x.x-win32.msi 下载地址:htt ...

  5. [ES7] Await multi promises sequentially or concurrently

    Somtime 'async await' can have a bad effect on code proferemence. Let's take a look the below exampl ...

  6. js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素

    js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素 一.总结 一句话总结:closest()方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上.of ...

  7. php获取调用本方法的上个方法,php堆栈,函数入库

    $array =debug_backtrace(); //print_r($array);//信息很齐全 unset($array[0]); foreach($array as $row) { $ht ...

  8. deep learning实践经验总结

    近期拿caffe来做图片分类.遇到不少问题,同一时候也吸取不少教训和获得不少经验. 先看样例再总结经验. 这是一个2类分类器.分的是条纹衣服和纯色衣服. 先看几张图片. 条纹衣服:   纯色衣服: w ...

  9. Go语言版黑白棋

    1.游戏说明 2.无边框窗口实现 3.背景图.最小化.关闭窗口 4.界面其它设计 5.黑白子提示闪烁效果 6.落子 7.初始化棋子.改变角色 8.倒计时 9.吃子 10.棋子个数统计.胜负判断 11. ...

  10. 【codeforces 750D】New Year and Fireworks

    time limit per test2.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...