免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 929 | 回复: 0
打印 上一主题 下一主题

进程网间通讯--socket(1) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-15 17:36 |只看该作者 |倒序浏览

                    进程网间通讯--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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP