Linux系统编程之基础篇

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;
}

此程序中可能存在漏洞希望多多包涵!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值