- 论坛徽章:
- 0
|
进程网间通讯--socket
1. 概念
1.1. 有连接
有连接也称作虚电路。首先双方互相之间要建立一种虚拟的连接,然后通过虚拟的连接进行通讯。有连接是可靠的,有序的,每个报文之间是有联系的。基于TCP协议连接就是有连接
1.2. 无连接
无连接并不预先建立虚链路而直接发送、接收报文,每个报文是孤立的,无序的,所以是不可靠的。基于UDP连接就是无连接。
2. 通讯握手流程
3. Socket函数
3.1 socket―――建立套接口
#include sys/types.h>
#include sys/socket.h>
int socket(int domain, int type, int protocol);
成功返回套接口,否则出错返回-1。
参数
说明
domain
协议类型通常是AF_INET, ipv4的tcp/ip 协议
type
套接口样式。通常用:有连接的数据流式 SOCK_STREAM和无连接的数据报式SOCK_DGRAM。
protocol
默认是0。表示有前2个参数决定的流程。
3.2 bind ―――绑定地址
#includesys/types.h>
#includesys/socket.h>
int bind(int sockfd,struct sockaddr*my_addr,int addrlen) ;
成功返回0,否则出错返回-1。
参数
说明
sockfd
已创建的套接字
my_addr
绑定的结构信息,包含地址,端口
addrlen
绑定的数据大小,
struct sockaddr
{
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14];
};
sa_data则包含该socket的IP地址和端口号。通常用struct sockaddr_in结构替代使用。
struct sockaddr_in
{
short int sin_family;
unsigned short int sin_port; /*端口号*/
struct in_addr sin_addr; /*IP地址*/
unsigned char sin_zero[8]; /*填充0保持与struct sockaddr同构*/
};
说明:Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。
h:host n:net l:long s:shot
#include netinet/in.h>
uint32_t htonl(uint32_t hostlong);// 把32位unsigned integer值从主机字节序转换成网络字节序
uint16_t htons(uint16_t hostshort); //把16位unsigned short integer值从主机字节序转换成网络字节序
uint32_t ntohl(uint32_t netlong); //把32位unsigned integer值从网络字节序转换成主机字节序
uint16_t ntohs(uint16_t netshort); //把16位unsigned short integer值从网络字节序转换成主机字节序
3.3 listen ―――创建侦听队列,开始接受连接
#include sys/socket.h>
int listen(int s, int backlog);
成功返回0,否则出错返回-1
参数
说明
s
已绑定的套接字,作为侦听套接口
backlog
最大连接数,即侦听队列最大长度
3.4 accept―――接受连接请求
#include sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);
成功返回连接的套接口,否则出错返回-1
参数
说明
sockfd
侦听套接口
addr
接受连接的client套接口信息。
addrlen
数据信息长度
通常接受连接后fork一个进程处理。父进程关闭新的连接,子进程释放侦听端口。
3.5 connect ―――客户端请求连接
#include sys/types.h>
#include sys/socket.h>
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
成功返回0,否则出错返回-1
参数
说明
sockfd
客户端套接口
serv_addr
连接的数据信息结构,包含服务端地址,端口
addrlen
数据大小,
4. 数据传输
#include sys/types.h>
#include sys/socket.h>
4.1 send和recv一般用在有连接的数据收发
ssize_t send(int s, const void *buf, size_t len, int flags);
成功返回已发送数据长度,否则出错返回-1
参数
说明
s
从那个套接字发数据
buf
发送的数据内容
flags
控制标志。默认是0 时和write没区别
send和recv是为插口专设的,write和read是通过常规的文件操作,都是通过send_msg来最终发送。
ssize_t recv(int s, void *buf, size_t len, int flags);
参数
说明
s
从那个套接字接收数据
buf
接收的数据内容
en
需要接收的数据大小
flags
控制标志。默认是0 时和read没区别
4.2 sendto和recvfrom一般用在无连接的数据收发
ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
参数
说明
s
从那个套接字发数据
buf
发送的数据内容
len
需要发送的数据大小
flags
控制标志。默认是0 时和read没区别
to
发送目标,绑定的结构信息,包含地址,端口
tolen
目标结构大小
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
参数
说明
s
从那个套接字接收数据
buf
接收的数据内容
len
需要发送的数据大小
flags
控制标志。默认是0
to
接收目标,绑定的结构信息,包含地址,端口
tolen
接收目标结构大小
5. 套接字关闭―――通过文件系统操作。
#include unistd.h>
int close(int fd);
成功返回0,否则出错返回-1
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/53810/showart_423262.html |
|