IPC-进程间通信-套接字

简单的客户端C与服务器S通信

 

服务端S使用函数及其顺序:


套接字文件描述符状态

 

socket()     阻塞

bind() 阻塞

listen() 监听

accept() 监听/阻塞,(等待客户端的connect申请,收到connect申请后:ESTABLISHED状态 )

recv() ESTABLISHED

close() 关闭

 

客户端C使用函数及其顺序:


套接字文件描述符状态

 

socket() 阻塞

connet() 阻塞,三次握手后:ESTABLISHED状态

send() ESTABLISHED

close() 关闭

 

 

函数的作用:

 

socket 返回的套接字文件描述符A默认为阻塞,但可通过setsockopt函数设置该文件描述符的属性

 

bind 使套接字A绑定IP和端口,S要绑定本机IP和端口,C要绑定S的IP和端口

 

listen 使A进入监听状态

 

accept S处于监听的A等待C的链接申请,当C通过connect函数发来的申请,S与C进行三次握,握手成功返回一个新的文件描述符B用 于与C通信同时状态为ESTABLISHED

 

connect C向S发送通信申请,三次握手成功后,文件描述符为ESTABLISHED

 

send C用于向S发送数据

 

recv S用于接收C发过来的数据

 

函数的参数:

协议族 套接字类型


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

     PF_INET SOCK_STREAM

     PF_UNIX SOCK_DGRAM

     PF_NS SOCK_RAW

     PF_IMPLINK  

 

 

 

<sys/types.h>

<sys/socket.h>

 

返回:成功:套接字文件描述符

 失败:-1

 

 

相关的数据结构:

 

int bind (int  sockfd, struct sockaddr  *addr, int  addrlen)


由socket返回          地址属性 指定地址属性长度

 

返回:0或-1

 

 

通用地址结构

struct sockaddr

{

u_short sa_family;  //协议族

char sa_data[14]; //14字节协议地址

}

 

intetnet协议地址结构

 

struct sockaddr_in

{

u_short sin_family; //协议族

u_short sin_port; //端口

struct in_addr sin_addr; //IPV4地址

char sin_zero[8]; //

}

 

struct in_addr

{

in_addr_t s_addr; //u32   IP地址

}

 

在使用bind是必须初始化以上数据结构

 

int  listen(int sockfd, int backlog)

监听连接的套接字 指定连接的队列长度(连接数)

 

 

<sys/types.h>

<sys/socket.h>

 

使用在TCP服务器
返回:0或-1
int accept(int sockfd, struct  sockaddr  *addr, socklen_t  *addrlen)
监听套接字 用来存储客户端地址信息 用来存储客户端地址长度
<sys/types.h>
<sys/socket.h>
使用在TCP服务器
返回:已建立好连接的套接字 或-1
int connect(int sockfd, cont struct sockaddr *addr, socklen_t  addrlen)
   由socket返回 用来服务器地址信息 服务器地址信息长度

<sys/types.h>
<sys/socket.h>
由客户端使用
返回:0或-1
ssize_t  send(int sockfd, const void *buf, size_t len, int flags)

由socket返回 发送缓冲首地址 发送字节数 发送方式

=0时相当于write函数

<sys/socket.h>

返回:实际发送字节数 或-1

 

 

ssize_t  recv(int sockfd, const void *buf, size_t len, int flags)


参数同send



返回:实际接收字节数 或-1


其他函数:


memset() bzero()用于清空  地址属性机构体

sendto()  

recvfrom()





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值