Socket网络编程

TCP网络编程基础

套接字

  • Tcp网络编程流程

    TCP网络编程架构
    创建网络插口函数socket()
    绑定一个地址端口对bind()
    监听本地端口listen
    接受一个网络请求accept()
    连接目标网络服务器connect()
    写入数据函数write()
    读取数据函数read()
    关闭套接字函数

    man 7 ip
    man 7 socket
    man 7 unix可以查到你要的一切

  • 套接字结构地址

  struct sockaddr_in {
      sa_family_t    sin_family; /* address family: AF_INET */
      in_port_t      sin_port;   /* port in network byte order */
      struct in_addr sin_addr;   /* internet address */
  };

这里写图片描述

socket

int socket(int domain, int type, int protocol);
socket()函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个表示这个套接字的文件描述符,失败的时候返回–1

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在一起,将sockfd绑定到某个端口上,如果使用connect()函数则没有绑定的必要

int sfd;
struct sockaddr_un  addr;
sfd = socket(AF_UNIX,SOCK_STREAM,0);/*这里使用的是AF_UNIX协议族*/
if(sfd < 0)
{
    >perror("socket()");
    exit(1);
}
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path,"/tmp/mysql.socket",sizeof(addr));
if(bind(sfd,(void *)&addr,sizeof(addr) <0)
{
    perror("bind()");
    exit(1);
}
 close(sfd);

int listen(int sockfd, int backlog);
listen()用来初始化服务器可连接队列,服务器处理客户端连接请求的时候是顺序处理的,同一时间仅能处理一个客户端连接。当多个客户端的连接请求同时到来的时候,服务器并不是同时处理,而是将不能处理的客户端连接请求放到等待队列中,这个队列的长度由listen()函数来定义
backlog表示等待队列的长度。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
当一个客户端的连接请求到达服务器主机侦听的端口时,此时客户端的连接会在队列中等待,直到使用服务器处理接收请求。
函数accept()成功执行后,会返回一个新的套接字文件描述符来表示客户端的连接,客户端连接的信息可以通过这个新描述符来获得

服务器/客户端简单例子

相关函数

字节序的转换

uint32_t htonl(uint32_t hostlong); /主机字节序到网络字节序的长整型转换/
uint16_t htons(uint16_t hostshort); /主机字节序到网络字节序的短整型转换/
uint32_t ntohl(uint32_t netlong); /网络字节序到主机字节序的长整型转换/
uint16_t ntohs(uint16_t netshort); /网络字节序到主机字节序的短整型转换/

Linux操作系统有一组函数用于网络地址的字符串形式和二进制形式之间的转换,其形式为inet_xxx()。

1.inet_aton()函数
2.inet_addr()函数
3.inet_network()函数
4.inet_ntoa()函数
5.inet_makeaddr()函数
6.inet_lnaof()函数
7.inet_netof()函数

int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

IP地址和域名直间的相互转换

struct hostent *gethostbyaddr(const void *addr,socklen_t len, int type);

struct hostent *gethostbyname(const char *name);
gethostbyname(“www.baidu.com”);

int getaddrinfo(const char *node, const char *service,const struct addrinfo *hints,struct addrinfo **res);
int getnameinfo(const struct sockaddr *sa, socklen_t salen,char *host, socklen_t hostlen,char *serv, socklen_t servlen, int flags);

协议名处理函数

struct protoent *getprotoent(void);
struct protoent *getprotobyname(const char *name);
struct protoent *getprotobynumber(int proto);
void setprotoent(int stayopen);
void endprotoent(void);

UDP协议

这里写图片描述

代码示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值