IP地址的转换

#include <arpa/inet.h> 


int inet_aton(const char *strptr, 
                   struct in_addr *addrptr);
//将strptr字符串转换成32位的网络字节序(二进制值--a.b.c.d->32)。

int_addr_t inet_addr(const char *strptr)
//功能通上,返回地址。
in_addr addr;
addr.s_addr = inet_addr("192.168.2.103");


char *inet_ntoa(stuct in_addr inaddr);//32位IP->a.b.c.d形式的
//将32位网络字节序二进制地址转换成点分十进制的串

a代表ASCII,n代表network。

网络、主机字节序转换函数

主机序转换到网络序:
u_short htons (u_short short);
u_long htonl (u_long  hostlong);

网络序转换到主机序:
u_short ntohs (u_short short);
u_long ntohl (u_long hostlong);

h(host),n(network),l(long),s(short)

通过主机名访问网络

主机结构体


struct hostent
{
    char *h_name;//主机的正式名称
    char *h_aliases;//主机的别名
    int  h_addrtype;//主机的地址类型 AF_INET
    int h_length;//主机的地址长度
    char **h_addr_list;//主机的IP地址列表
}
#define h_addr h_addr_list[0] //主机的第一个IP地址
struct hostent *gethostbyname(const char *hostname)

socket

通用地址结构:

struct sockaddr
{
    u_short sa_family;//协议族
    char sa_data[14];//地址协议
}

Internet协议地址结构

struct sockaddr_in
{
    short int sin_family;//协议族
    unsigned short int  sin_port;//端口号
    struct in_addr sin_addr;//协议特定地址
    unsigned char si_zero[8];//未使用,填0
}
一般使用与sockaddr等价的sockaddr_in数据结构

IPv4地址结构

struct in_addr
{
    u_long s_addr;
}

创建一个socket

int socket(int domain,    //协议族
                  int type,    //套接字类型
                  int protocol)    //标识位
头文件:
#include <sys/types.h>
#include <sys/socket.h>

参数的选项:
domain
AF_INET//internet协议
AF_UNIX//unix internal协议
AF_NS//Xerox NS协议
AF_IMPLINK//Interface Message协议
type
SOCK_STREAM//流式socket
SOCK_DGRAM//数据报socket
SOCK_RAW//raw socket
protocol参数通常设置为0

返回值:
成功返回socket的描述符,
失败返回-1.
                          


用于绑定IP地址和端口号到socket

int bind(int sockfd,    //由socket调用返回的文件描述符。
              struct sockaddr *my_addr,    //指向sockaddr_in结构的指针,包含server IP的地址和端口号。
              int addrlen);    //sockaddr结构的长度(sizeof(sockaddr_in))。
返回值:
成功0,失败-1;




设置服务器能处理的最大连接要求 

#include <sys/socket.h>
int listen(int sockfd,    //监听连接的socket。
             int bakclog)    //请求排队的最大长度。

listen()将bind的文件描述符变为监听套接字
返回值:
文件描述符或-1;

                             



等待客户端的socket连接请求 

int accept (int sockfd,    //listen后的文件描述符,接收客户端连接的Socket。
                   struct sockaddr *addr,    //接收外来连接的地址信息。(若不需要可设置NULL)
                   socklen_t *addrlen);    //addr结构的长度。

返回值:
成功:新连接的Socket,(并使用其与客户进行通讯,原Socket继续接受其它客户的连接)。
失败:-1

与服务器建立连接

int connect(int sockfd,    //socket返回的文件描述符
                     struct sockaddr *serv_addr,    // 服务器端的连接信息,.sin_add是服务端地址
                     int addrlen)    //serv_addr的长度
头文件:
#include <sys/types.h>
#include <sys/socket.h>

返回值:
0或-1;




关闭双向通道
int close (int sockfd);


int shutdown(int sockfd,
                         int howto)    //SHUT_RD关闭读终端,SHUT_WR关闭写终端。

返回值:
成功:0
失败:-1

接收、发送数据(TCP)
ssize_t recv(int socket, void *buffer, size_t length, int flages);//接收数据 
ssize_t send(int socket, const void *buffer, size_t length, int flags)//发送数据
头文件:
#incldue <sys/socket.h>
参数:
socket: 已经连接的Socket。
buffer: 指向用于接收数据的缓冲区的指针。
length: 缓冲区的大小(字节)。
flags: MSG_OOB或0(send()还有etc).
返回值:
成功接收或发送的字节数。
失败返回-1,并设置errno。
recv返回0,连接断开。




接收、发送数据(UDP)
头文件:
#include < sys/types.h >   
#include < sys/socket.h >

接收远程主机经指定的socket传来的数据(接收)
 
ssize_t recvfrom(int sockfd,    //套接字描述符
                        void *buf,    //缓冲区
                        int len,    //可接收数据的最大长度.
                        unsigned int flags,    //一般设0,
                        struct sockaddr *from,    //指定欲传送的网络地址
                        socket_t *fromlen);    //结构长度

ssize_t 相当于 int,socket_t 相当于int 。

返回值:

成功则返回接收到的字符数,
失败返回-1. 


将数据由指定的socket传给对方主机(发送)

int sendto ( int s ,     //已建好连线的socket,如果利用UDP协议则不需经过连线操作
                const void * msg,     //发送缓冲区
                int len,     // 发送的数据大小
                unsigned int flags,     //一般设0
                const  struct sockaddr * to ,     //指定欲传送的网络地址
                int tolen )     //sockaddr的结果长度

返回值
成功则返回实际传送出去的字符数,
失败返回-1,并设置errno 。


使用文件描述符的函数处理套接字时的行为

                             



UNIX环境高级编程——网络编程常用函数及结构的更多相关文章

  1. UNIX环境高级编程——TCP/IP网络编程 常用网络信息检索函数

    UNIX环境高级编程——TCP/IP网络编程   常用网络信息检索函数 gethostname()   getppername()   getsockname()   gethostbyname() ...

  2. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...

  4. UNIX环境高级编程——sigqueue、sigsuspend函数

    一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. int sigqueue(pid_t pid, int sig, ...

  5. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. BigData-‘基于代价优化’究竟是怎么一回事?

    本文由  网易云发布. 本文具体讨论了Join基础算法的一种优化方案  – Runtime Filter,在本文最后还引申地聊了聊谓词 下推技术.同时,在本文文章开头,笔者引出了两个问题,SQL执行引 ...

  2. PHP 中 config.m4 的探索

    PHP 中 config.m4 的探索 最近在看php扩展相关的东西,虽然来来回回编辑了好多次config.m4,并且也在技术社区看到了 config.m4是什么?什么作用? 类的问题,但是还是觉得有 ...

  3. Linux学习之CentOS(十四)----磁盘管理之 硬连接与软件连接(转)

    前言 在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录),这种是软链接: 另一种则是透过文件系统的 inode 连结来产生新档 ...

  4. 聪明的搜索算法’ A*算法

    A*算法     是一种启发式的搜索算法. 了解BFS.DFS或者Dijkstra算法的人应该知道.这些算法都是一种向四周盲目式搜索的方法.   启发式搜索:     启发式搜索就是在状态空间中的搜索 ...

  5. 去掉textarea和input在ios下默认出现的圆角

    -webkit-appearance:none;/*清除ios默认圆角*/ border-radius:0;

  6. 阿里云部署Node.js项目(CentOS)

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ...

  7. Linux下查看alert日志文件的两种方法

    --linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...

  8. 毕业回馈-89c51之定时器/计数器(Timer/Count)

    今天分享的是89c51系列单片机的内部资源定时器/计数器,在所有的嵌入式系统中都包含这两个内部功能. 首先先了解几个定时器/计数器相关的概念: •时钟周期:时钟周期 T 是时序中最小的时间单位,具体计 ...

  9. ACM 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  10. ACM 排列2

    Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数.  Input每组数据占一行,代表四张卡片上的数字(0<=数字<=9 ...