UNIX网络编程:socket套接字(TCP与UDP)

套接字简介:

套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行,Linux所提供的功能(如打印服务,ftp等)通常都是通过套接字来进行通信的,套接字的创建和使用与管道是有区别的,因为套接字明确地将客户和服务器区分出来,套接字可以实现将多个客户连接到一个服务器。

套接字创建流程以及所用到的函数:

首先socket通信中需要以下几个结构体:

struct in_addr
{
        in_addr_t  s_addr;          //32位IPV4地址
}

struct sockaddr_in
{
       uint8_t         sin_len;           //结构体长度
       sa_family_t   sin_family;      //协议族
       in_port_t      sin_port;         //端口号
       struct in_addr   sin_addr;   //32位 IPV4地址
       char                   sin_zero[8]    //保留
}

1、创建套接字:
int socket(int domain, int type, int protocol); //使用前创建一个新的套接字

参数1(domain):选择创建的套接字所用的协议族;常用的有以下选择:
AF_INET : IPv4协议;
AF_INET6: IPv6协议;
AF_LOCAL: Unix域协议;
AF_ROUTE:路由套接口;
AF_KEY :密钥套接口。
参数2(type):指定套接口类型,所选类型有:
SOCK_STREAM:字节流套接字;
SOCK_DGRAM : 数据报套接字;
SOCK_RAW : 原始套接口。
procotol: 使用的特定协议,一般使用默认协议(NULL)。
2、指定本地地址
int bind(int socket, const struct sockaddr *address, socklen_t address_len); //将套接字地址与所创建的套接字号联系起来。
参数1(socket) : 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
参数2(address):指向特定协议的地址指针。
参数3(address_len):上面地址结构的长度。
返回值:没有错误,bind()返回0,否则SOCKET_ERROR。
3、建立套接字连接

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);        //客户端请求连接
int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);       //服务器接受连接工作

参数1(socket) : 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
参数2(address):指向特定协议的地址指针。
参数3(addrlen):上面地址结构的长度。
返回值:没有错误,bind()返回0,否则SOCKET_ERROR。
4、监听连接
int listen(int sockfd, int backlog); //用于面向连接服务器,表明它愿意接收连接。
参数1(sockfd):是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
参数2(backlog):所监听的端口队列大小。
5、数据传输
ssize_t send(int sockfd, const void *buf, size_t len, int flags); //发送数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags); 接收数据

参数1(buf):指向存有传输数据的缓冲区的指针
参数2(len):缓冲区长度。
参数3(flags):flags的值或为0,或由下面常值中选择一个:
MSGD_DONTROUTE:不查路由表 (send可选)
MSG_DONTWAIT : 本操作不阻塞 (send、recv均可选)
MSG_OOB : 发送或接收带外数据。 (send、recv均可选)
MSG_PEEK : 查看外来的消息 (recv可选)
MSG_WAITALL : 等待所有数据 (recv可选)

6、关闭套接字
int close(int fd); //关闭套接字
参数(fd):是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。

TCP与UDP:
(TCP)传输控制协议,面向连接。是一种提供可靠数据传输的通用协议。
(UDP)用户数据报协议,是一个面向无连接的协议。采用该协议不需要两个应用程序先建立连接。UDP协议不提供差错恢复,不能提供数据重传,因此该协议传输数据安全性差。

TCP示现客户—服务器程序:
TCP客户—服务器程序的执行流程图:
这里写图片描述

TCP客户—服务器程序代码:
Ser.cpp:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值