Socket的基本使用步骤

一.使用Socket,首先需要导入这几个系统头文件

  #import <sys/socket.h>

  #import <netinet/in.h>

  #import <arpa/inet.h>

二.然后就是进行Socket代码的编写,先来看看实现一个简单的Socket通信需要哪些步骤:

  >1.创建客户端Socket;

  >2.创建服务器Socket;

  >3.连接两个Socket;

  >4.客户端Socket发送信息给服务器(发送请求的过程);

  >5.服务器响应客户端的请求,返回给客户端数据(服务器响应的过程);

  >6.客户端接受服务器返回的数据;

  >7.关闭Socket;

三.下面要进行详细的Socket代码实现了.

  1.创建客户端Socket

  //参数1:协议域: 遵守的IP协议类型! AF_INET:IPv4  AF_INET6:IPv6

  //参数2:端口类型: TCP:SOCK_STREAM   UDP:SOCK_DGRAM

  // 参数3: 选择的协议类型! 一般传0 会根据第二个参数自动选择协议类型!

  // 返回值: 如果返回值>0 ,标示 Socket 创建成功!

  int SocketNumber = socket(AF_INET,SOCK_STRESM,0);

  

  

  2. 创建服务器端 Socket

    struct sockaddr_in serverAddress;

     // 主机 /端口

    // 设置 服务器Socket 遵循的 IP 协议类型为 IPv4

   serverAddress.sin_family = AF_INET;

// 服务器 Socket 的 IP 地址

serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

// 设置服务器Socket 的端口号;

// 端口号的最大值 65535;  09~1024 是系统默认占用的端口号!不要设置!

// 如果需要手动设置端口号: 一般设置 1024 ~ 65535 之间的值!

serverAddress.sin_port = htons(3456);

3. 连接两个 Socket

// 参数1: 客户端的 Socket

// 参数2: 服务器端 Socket/结构体 (const struct sockaddr *)&serverAddress 强制类型转换

// 参数3: 第二个参数的长度! sizeof(serverAddress) 计算长度! 计算的是内存地址的长度!

// 返回值: 如果返回值为0 代表连接成功!

// 返回值 != 0 ,代表连接失败!

// 如果想要连接成功,必须实时监测服务器端的端口!

// 监测服务器端口: nc -lk 12345

int conn = connect(SocketNumber, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));

4. 发送信息给服务器

// 参数1: 客户端 Socket

// 参数2: void * 传递给服务器的数据!  msg.UTF8String 就是直接将 OC 数据转换成 C 语言的数据类型!

// 参数3: size_t 锁传递给服务器数据的长度!

// 参数4: 传0 等待服务器响应数据!

NSString *msg = @"hello socket";

send(SocketNumber, msg.UTF8String, strlen(msg.UTF8String), 0);

5.接受服务器返回的数据!

// 参数1:客户端 Socket :服务器确定返回给哪一个客户端数据.

// 参数2:void * :接收服务器返回数据的地址(区域)

// 参数3:size_t :接受地址的长度

// 参数4:传0 等待服务器返回数据!

// 返回值: 就是服务器返回的数据长度!

ssize_t buffer[1024];

ssize_t length = recv(SocketNumber, buffer,sizeof(buffer), 0);

// 获得服务器返回的数据(从 buffer 中取出需要的数据)

// 根据二进制数据,拼接字符串

// Bytes: 网络中传递的数据流(比特流/字节)

NSString *returnMsg = [[NSString alloc] initWithBytes:buffer length:length encoding:NSUTF8StringEncoding];

6.一个请求结束之后(接收到响应之后),需要手动关闭Socket!

close(SocketNumber);

Socket的基本使用步骤的更多相关文章

  1. python socket 编程之一:编写socket的基本步骤

    一.socket 编写server的步骤: 1.第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family ...

  2. TCP/IP、Http、Socket、XMPP-从入门到深入

    TCP/IP.Http.Socket.XMPP-从入门到深入 终极iOS程序猿 2016-12-29 18:27 为了便于大家理解和记忆,我们先对这几个概念进行的介绍,然后分析他们的不同,再进行详细的 ...

  3. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  4. tomcat通过socket连接MySQL,不再占用服务端口【linux】

    MySQL连接方式的说明 http://icbm.iteye.com/blog/1840673 MySQL除了最常见的TCP连接方式外,还提供SOCKET(LINUX默认连接方式).PIPE和SHAR ...

  5. 使用 Socket 通信实现 FTP 客户端程序(来自IBM)

    FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...

  6. iOS的TCP/IP协议族剖析&&Socket

    原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有S ...

  7. Java Socket编程题库

    一.    填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...

  8. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  9. C# Socket编程笔记(转)

    C# Socket编程笔记 http://www.cnblogs.com/stg609/archive/2008/11/15/1333889.html TCP Socket:Server 端连接步骤: ...

随机推荐

  1. Nginx根据目录自动生成二级域名

    前言:     每次创建二级域名如果都修改一次配置文件的话,项目多了会带来很多不必要的工作量,如果能够在一个web目录下创建一个文件夹并且自动生成文件目录的话,那真是极好的,本文就基于Nginx贴出这 ...

  2. thinkPHP5.0联表查询和统计文章的图片(栏目文章)数量

    public function index(){ //获取内容列表信息 $res = db('article')->alias('a') ->join('category b', 'b.i ...

  3. Microsoft使用技巧

    1.拍摄屏幕内容的截图 按 Win + Shift + S 以打开截图栏,然后将光标拖动到要捕获的区域. 截图区域将保存到剪贴板. 2.使用键盘添加表情符号 随心随处表达自我. 按 Ctrl + Sh ...

  4. C语言有GetOpenFile吗?

    windows中有个GetOpenFile的函数,就是上面那个啦!!我们怎么来实现呢?要我用C语言写出来我真的跪了..但是我们可以输入文件的[绝对路径],配合fopen函数来实现的.. 注意问题 ①文 ...

  5. python的基础数据类型

    Python基础数据类型 定义: int    => 数字类型 str   => 字符串数据类型 bool  =>布尔值,True False list 列表,用来存放大量数据  [ ...

  6. jquery.getParams.js

    本文参照:http://www.cnblogs.com/cocos/archive/2010/05/14/1735046.html jQuery.extend({ /** * Returns get ...

  7. MongoDB数据库常用操作

    推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...

  8. java代码混淆

    仅做记录之用. java代码可以反编译,因此有时候要保护自己的知识产权还真得费点心思,一般来说有三个思路: 1.将class文件加密,这个是最安全的,但也费事儿,因为要重写classloader来解密 ...

  9. mybatis连接mysql数据库实现的jdbc功能

    最近公司项目要使用myBatis,自己以前没有接触过,就在网上找到了一些资料研究了些.初步做出了基于myBatis连接mysql数据库的jdbc实现的功能. employee.java package ...

  10. C++中string erase函数的使用

    erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator p ...