socket接口详解

1. socket概述

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

2.接口详解

socket():创建socket

bind():绑定socket到本地地址和端口,通常由服务端调用

listen():TCP专用,开启监听模式

accept():TCP专用,服务器等待客户端连接,一般是阻塞态

connect():TCP专用,客户端主动连接服务器

send():TCP专用,发送数据

recv():TCP专用,接收数据

sendto():UDP专用,发送数据到指定的IP地址和端口

recvfrom():UDP专用,接收数据,返回数据远端的IP地址和端口

closesocket():关闭socket

2.1 socket()

原型:int socket (int domain, int type, int protocol)

功能描述:初始化创建socket对象,通常是第一个调用的socket函数。 成功时,返回非负数的socket描述符;失败是返回-1。socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用socket()函数时,socket执行体将建立一个socket,实际上"建立一个socket"意味着为一个socket数据结构分配存储空间。socket执行体为你管理描述符表。

参数解释

domain -- 指明使用的协议族。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

type -- 指明socket类型,有3种:

SOCK_STREAM -- TCP类型,保证数据顺序及可靠性;

SOCK_DGRAM -- UDP类型,不保证数据接收的顺序,非可靠连接;

SOCK_RAW -- 原始类型,允许对底层协议如IP或ICMP进行直接访问,不太常用。

protocol -- 通常赋值"0",由系统自动选择。

2.2 bind()

原型:int bind(int sockfd, const struct sockaddr* myaddr, socklen_t addrlen)

功能描述:将创建的socket绑定到指定的IP地址和端口上,通常是第二个调用的socket接口。返回值:0 -- 成功,-1 -- 出错。当socket函数返回一个描述符时,只是存在于其协议族的空间中,并没有分配一个具体的协议地址(这里指IPv4/IPv6和端口号的组合),bind函数可以将一组固定的地址绑定到sockfd上。

通常服务器在启动的时候都会绑定一个众所周知的协议地址,用于提供服务,客户就可以通过它来接连服务器;而客户端可以指定IP或端口也可以都不指定,未分配则系统自动分配。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

注意

(1) 如果有多个可用的连接(多个IP),内核会根据优先级选择一个IP作为源IP使用。

(2) 如果socket使用bind绑定到特定的IP和port,则无论是TCP还是UDP,都会从指定的IP和port发送数据。

参数解释

sockfd -- socket()函数返回的描述符;

myaddr -- 指明要绑定的本地IP和端口号,使用网络字节序,即大端模式(详见3.1)。

addrlen -- 常被设置为sizeof(struct sockaddr)。

可以利用下边的赋值语句,自动绑定本地IP地址和随机端口:

my_addr.sin_port = 0;    /
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket是一种通信机制,它允许两个不同的进程在网络上进行通信。在iOS开发中,我们可以使用CocoaAsyncSocket库来实现Socket通信。 在Socket通信中,我们通常使用NSStream类来进行数据的读写。NSStream是一个抽象类,它定义了抽象接口,可以通过其子类NSInputStream和NSOutputStream来实现具体的输入和输出流。 NSInputStream和NSOutputStream都是从NSStream类继承而来的,它们分别用于从Socket中读取数据和向Socket中写入数据。它们提供了一系列的方法来读写数据,比如read:maxLength:和write:maxLength:等。 在进行Socket通信时,我们需要先建立Socket连接,然后创建一个NSInputStream和一个NSOutputStream对象,将它们分别与Socket进行关联。这样,我们就可以通过这两个对象来进行数据的读写操作了。 具体实现可以参考以下代码示例: ``` // 建立Socket连接 CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"127.0.0.1", 80, &readStream, &writeStream); // 将NSInputStream和NSOutputStream对象与Socket关联 NSInputStream *inputStream = (__bridge NSInputStream *)readStream; NSOutputStream *outputStream = (__bridge NSOutputStream *)writeStream; // 打开输入和输出流 [inputStream open]; [outputStream open]; // 读取数据 uint8_t buffer[1024]; NSInteger len = [inputStream read:buffer maxLength:sizeof(buffer)]; NSData *data = [NSData dataWithBytes:buffer length:len]; // 写入数据 NSString *message = @"Hello, Socket!"; NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding]; [outputStream write:[data bytes] maxLength:[data length]]; ``` 以上代码示例展示了如何使用NSStream类进行Socket通信。我们首先建立Socket连接,并将NSInputStream和NSOutputStream对象与Socket关联。然后,我们打开输入和输出流,并通过read:maxLength:和write:maxLength:方法进行数据的读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值