您的位置:首页 > 编程语言

socket编程函数详解

2016-05-20 20:54 246 查看
socket()
#include <sys/types.h>
#include <socket.h>
int socket(int domain,int type,int protocol)
返回值:成功返回一个文件描述符(注意,这个套接字不能用于和用户进行通信,只能用于listen和accept客户端的连接请求),失败返回-1
参数
domain
AF_INET IPv4 Internet protocols
type
SOCK_STREAM 可以提供测序、可靠的双向,字节流
SOCK_DGRAM 支持数据报(无连接、不可靠消息的一个固定的最大长度)
protocol
can be specified as 0

bind()
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
返回值:成功返回0,失败返回-1
描述:
当创建一个套接字,它存在于一个名称空间(家庭地址),但没有地址分配给它。bind()将指定的地址赋给addr的套接字sockfd提到的文件描述符。addrlen,以字节为单位,指出通过addr的地址结构。传统上,这个操作称为“将一个名称分配给一个套接字”。

#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family

struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
};

typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};

listen()
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
返回值:成功返回0,失败返回-1
参数:
backlog
待办事项列表参数定义等待连接的队列的最大长度为sockfd可能增长。如果一个连接请求到达队列满时,客户端可能会收到一个错误的指示ECONNREFUSED或者,如果底层协议支持重传,请求可能会被忽略,这样在连接成功后再尝试。

accept()
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
描述:
accept()函数创建并返回了一个新的套接字client_sock,用于与客户端通信。
假设一共有3个客户端连接到服务器端。那么在服务器端就一共有4个套接字:第1个是socket()返回的、用于监听的套接字;其余3个是分别调用3次accept()返回的不同的套接字。

send()
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
返回值:
>0 数据发送成功
<=0 发送失败需要重试
参数:
前三个参数等同于write
sockfd:发送端套接字描述符;
buf:发送端的发送缓冲区,用来暂时存放要发送的数据;
len:要发送数据的长度;
第四个参数flag的参数值说明:



flag一般设为0
描述:
send先检查发送端要发送数据的长度len和sockfd发送缓冲区的长度,如果len>sockfd发送缓冲区的长度,函数返回SOCKET_ERROR;
如果len<=发送端缓冲区的长度,send就先检查协议是否正在发送 发送缓冲区的数据,如果协议正在发送数据,则send等待协议发完数据,如果此时协议还没有开始发送sockfd发送缓冲区的数据或者该缓冲区为空,那么send就比较len和sockfd发送缓冲区剩下的长度;
如果len>sockfd发送缓冲区的剩余长度,send就等待协议把发送缓冲区上的数据发送完毕,如果len<发送缓冲区的剩余长度,send就把buf中的数据copy到sockfd发送缓冲区的剩余空间里;
如果send函数copy成功,则返回实际拷贝的字节数,否则返回SOCKET_ERROR;send函数把数据copy到sockfd发送缓冲区后就返回了,此时这些数据不一定被对端收到了(因为数据的传输是由协议来完成的,send在copy之后就返回了),如果协议在传输数据的过程中出现网络错误的话,下一个send函数将出错返回SOCKET_ERROR;
每一个send在copy数据的时候都要等待上一个数据被协议传输到连接的另一端,如果协议在传输数据的过程,网络中断或出现异常,send函数就会返回SOCKET_ERROR.

recv()
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
返回值:
<0 出错
=0 对方关闭了连接
>0 接收到数据的字节数
参数:
前三个参数等同于read
sockfd:接收端套接字描述符
buf:接收端接收缓冲区,存放
len:buf的长度
第四个参数和send()的一样,一般置为0

connect()
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
sockfd:主动建立连接请求的套接字
addr:用来保存服务器端的端口号、ip地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket