标签:
连接
TCP/IP协议规定网络数据传输应采用大端字节序
#include <netinet/in.h>
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr_in {
sa_family_t sin_family; //short
in_port_t sin_port; // unsigned short
struct in_addr sin_addr;
};
sys/socket.h
int socket(int family, int type, int protocal);
family: AF_INET, AT_INET6, AF_UNIX
type: SOCK_STREAM(tcp), SOCK_DGRAM(udp)
protocal:协议 0
return:失败-1,成功fd。
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
return: 失败-1(设置errno),成功0
int listen(int sockfd, int backlog);
backlog:最多允许有多上个客户端处于连接等待状态,超过忽略。
return:失败-1,成功0
listen完成后,内核自动完成三次握手,与accept无关。
当有客户端发起链接时,服务器端调用accept()返回并接受这个连接。如果有大量客户端发起连接,服务器来不及处理,尚未accept的客户端就处于连接等待状态。
int accept(int sockfd, struct sockaddr cliaddr, socklen_t addrlen);
cliaddr:客户端地址(传出);
addrlen:传入传出(缓冲区大小,地址大小)
return:失败-1,成功:新的文件描述符。
服务器端调用accept()还没有客户端连接请求时,阻塞等待。
链接关闭时,返回错误码ECONNABORTED,此时应重试连接。
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
servaddr:服务器地址。
return:失败-1;成功0。
客户端port由内核自动分配。
当连接不成功时,应阻塞等待。
出错原因:
慢系统调用accept,read,write被信号中断时应该重试。对于accept,如果errno为ECONNABORTED,也应该重试。
读写数据
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
return:成功,返回读取到的字节数;失败-1。
有数据到达,返回读到的字节数;无数据到达,
sszie_t write(int fd, const void *buf, size_t count);
return:成功,返回写入的字节数;失败-1。
连接关闭,收到SIGPIPE。连接未关闭,
标签:
原文地址:http://www.cnblogs.com/embedded-linux/p/4984192.html