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的套接字文件描述符。如果函数调用成功,会返回一个表示这个套接字的文件描述符,失败的时候返回–1int 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);