码迷,mamicode.com
首页 > 其他好文 > 详细

socket

时间:2015-11-21 18:24:42      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

连接

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由内核自动分配。

当连接不成功时,应阻塞等待。

出错原因:

  1. 指定IP无效。
  2. 无服务器进程。
  3. 超时Timeout。

慢系统调用accept,read,write被信号中断时应该重试。对于accept,如果errno为ECONNABORTED,也应该重试。

读写数据

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

return:成功,返回读取到的字节数;失败-1。

有数据到达,返回读到的字节数;无数据到达,

  • 连接关闭,返回0
  • 连接未关闭,阻塞。

sszie_t write(int fd, const void *buf, size_t count);

return:成功,返回写入的字节数;失败-1。

连接关闭,收到SIGPIPE。连接未关闭,

  • 发生流量控制,阻塞;
  • 无流量控制,返回写入字节数。

socket

标签:

原文地址:http://www.cnblogs.com/embedded-linux/p/4984192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!