IP地址的转换函数:
in_addr_t inet_addr(const char* strptr);
<下面涉及的函数都将以此种方式解释>
函数三要素:1.函数名:inet——addr 2.函数返回值 :二进制的IP地址字节 序 3. 函数参数:字符串字节序:不同类型的CPU中,内存存储多字节整数序有两种方法---称为主机字节序(HBO)。
1.大端模式:即高序字节存储在低地址。
2.小端模式:即低字节存储在低地址。
网络中传输的数据必须按网络字节序,即大端字节序执行!
在大部分PC机上,当应用进程将整数送入SOCKET前需要转化成网路字节序(NBO)。
主机字节序到网络字节序的转化函数:
u_long htonl (u_long hostlong);
u_short htons(u_short short);
网络字节序到主机字节序的转化函数:
u_long ntohl(u_long hostlong);
u_short ntohs(u_short short);
创建套接字函数:
int socket (int domain,int type,int proctcl);
domain参数为:
PF_INET Internet 协议 (一般情况下都用PF_INET)
PF_UNIX UNIX协议
PF_NS
PF_IMPLINK
type为套接字类型:
SOCK_STREAM 流式套接字 TCP用
SOCK_DGRAM 数据报套接字 UDP用
SOCK_RAW 原始套接字
protocol参数设置为0
返回值为文件描述符(sockfd)。
用SOCKET产生的文件描述符来绑定IP地址和端口号
int bind(int sockfd,struct sockaddr *my_addr,int addrlen);
sockfd :SOCKET的返回值
第二个参数是结构体指针,在代码中会注释
第三个参数是结构体的长度
设置监听的函数:
int listen(int sockfd,int backlog);
sockfd:监听链接的套接字
backlog:指定了在等待链接的最大队列长度,DOS(拒绝服务)攻击即利用这个原理
返回值:成功返回0失败返回-1.
建立链接:
int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);
sockfd:监听套接字
第二个参数为:结构体指针为对方的地址
第三个参数为:地址结构体的长度
返回值:成功返回已建立好链接的套接字(即NEW_sockfd)失败返回-1
/*函数的演示*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, const char *argv[])
{
int listenfd,conntfd;
struct sockaddr_in myaddr,peeraddr;
if(argc < 3)
{
fprintf(stdout,"Usage : %s <ip> <port>\n",argv[0]);
exit(-1);
}
//int socket(int domain, int type, int protocol);创建套接字
if((listenfd = socket(PF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(-1);
}
memset(&myaddr,0,sizeof(myaddr));用bind前需要填充的结构体中的选项
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(atoi(argv[2]));
myaddr.sin_addr.s_addr = inet_addr(argv[1]);
//int bind(int sockfd, const struct sockaddr *addr, 利用bind函数
// socklen_t addrlen);
if(bind(listenfd,(struct sockaddr*)&myaddr,sizeof(myaddr)) == -1)
{
perror("bind");
exit(-1);
}
//int listen(int sockfd, int backlog); 监听
if(listen(listenfd,15) == -1)
{
perror("listen");
exit(-1);
}
while(1)
{
socklen_t len;
len = sizeof(peeraddr);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
if((conntfd = accept(listenfd,(struct sockaddr*)&peeraddr,&len)) == -1) 建立链接
{
perror("accept");
exit(-1);
}
printf("Welcome to server : [%s] [%d]\n",
inet_ntoa(peeraddr.sin_addr),
ntohs(peeraddr.sin_port));
close(conntfd);
}
return 0;
}
此程序中可能存在漏洞希望多多包涵!!!