客户端和服务端端口的建立与连接

socket(建立通信的端口,并返回引用该端口的文件描述符).

man sockst : https://man7.org/linux/man-pages/man2/socket.2.html

头文件

#include <sys/types.h>
#include <sys/socket.h>

函数

int socket(int domain, int type, int protocol);

说明

socket()创建用于通信的端点并返回文件引用该端点的描述符。文件描述符成功调用返回的将是编号最小的文件
该进程当前未打开描述符。

参数

domain(域):

AF_INET,AF_INEF6,AF_LOCAL,AF_ROUTE

函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。

表1 domain的值及含义

名称 含义
PF_UNIX,PF_LOCAL 本地通信
PF_X25 ITU-T X25 / ISO-8208协议
AF_INET,PF_INET IPv4 Internet协议
PF_AX25 Amateur radio AX.25
PF_INET6 IPv6 Internet协议
PF_ATMPVC 原始ATM PVC访问
PF_IPX IPX-Novell协议
PF_APPLETALK Appletalk
PF_NETLINK 内核用户界面设备
PF_PACKET 底层包访问

type(类型):

SOCK_STREAM,SOCK_DGRAM,SOCK_PACKET,SOCK_SEQPACKET

函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。

表2 type的值及含义

名称 含义
SOCK_STREAM Tcp连接,提供序列化的、可靠的、双向连接的字节流。支持带外数据传输
SOCK_DGRAM 支持UDP连接(无连接状态的消息)
SOCK_SEQPACKET 序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出
SOCK_RAW RAW类型,提供原始网络协议访问
SOCK_RDM 提供可靠的数据报文,不过可能数据会有乱序
SOCK_PACKET 这是一个专用类型,不能呢过在通用程序中使用

并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。

protocol(协议)

IPPROTO_TCP, IPPROTO_UDP, IPPROTO_TIPC;一般为0

函数socket()的第3个参数protocol用于制定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。

类型为SOCK_STREAM的套接字表示一个双向的字节流,与管道类似。流式的套接字在进行数据收发之前必须已经连接,连接使用connect()函数进行。一旦连

接,可以使用read()或者write()函数进行数据的传输。流式通信方式保证数据不会丢失或者重复接收,当数据在一段时间内任然没有接受完毕,可以将这个连接人为已经死掉。
SOCK_DGRAM和SOCK_RAW 这个两种套接字可以使用函数sendto()来发送数据,使用recvfrom()函数接受数据,recvfrom()接受来自制定IP地址的发送方的数据。
SOCK_PACKET是一种专用的数据包,它直接从设备驱动接受数据。

errno

函数socket()并不总是执行成功,有可能会出现错误,错误的产生有多种原因,可以通过errno获得:

表3 errno的值及含义

含义
EACCES 没有权限建立制定的domain的type的socket
EAFNOSUPPORT 不支持所给的地址类型
EINVAL 不支持此协议或者协议不可用
EMFILE 进程文件表溢出
ENFILE 已经达到系统允许打开的文件数量,打开文件过多
ENOBUFS/ENOMEM 内存不足。socket只有到资源足够或者有进程释放内存
EPROTONOSUPPORT 制定的协议type在domain中不存在

示例

建立一个流式套接字:

int sock = socket(AF_INET, SOCK_STREAM, 0);

返回值

成功返回新的文件描述符, 否则返回-1;

bind()( 绑定ip和端口)

头文件

#include <sys/types.h>
#include <sys/socket.h>

函数

int bind(int sockfd, const struct sockaddr addr, socketlen_t addrlen );

说明

sockfd是调用socket返回的文件描述符

addr是指向数据结构struct sockaddr 的指针, 它保存你的地址(即端口和IP地址)信息

addrlen设置为sizeof(struct sockaddr)

返回值

出错-1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值