3- 套接字编程简介--UNIX网络编程

1- 数据结构

2- 字节序

对于16位,32位的数据在内存中存放有两种方式:

大端方式:高字节数据存放在内存起始地址

小端方式:低字节数据存放在内存起始地址

检测系统大小端的测试代码:

#include	"unp.h"

int
main(int argc, char **argv)
{
	union {
	  short  s;
      char   c[sizeof(short)];
    } un;

	un.s = 0x0102;
	printf("%s: ", CPU_VENDOR_OS);
	if (sizeof(short) == 2) {
		if (un.c[0] == 1 && un.c[1] == 2)
			printf("big-endian\n");
		else if (un.c[0] == 2 && un.c[1] == 1)
			printf("little-endian\n");
		else
			printf("unknown\n");
	} else
		printf("sizeof(short) = %d\n", sizeof(short));

	exit(0);
}

网际协议使用大端字节序来传输数据

字节序转换的接口:

htons, ntohs;  htonl, ntohl

3- 表达式 <-> 数值 转化接口

约定以下概念:

表达式 格式: 以字符串表示的IP地址,示例:“192.168.2.125” 

数值格式 : 以数值表示的IP地址。示例0x7d02a8c0,其中192=0xc0,168=0xa8, 2=0x02, 1255=0x7d

/* 将 表达式格式的cp 转化为 数值格式inp。例如“192.168.2.125”  转化为7d02a8c0。 */
int inet_aton(const char * cp,struct in_addr *inp);  


/* 将 数值格式inp 转化为 表达式格式的cp。例如 7d02a8c0 转化为 “192.168.2.125”  。 */
char * inet_ntoa(struct in_addr in);


/* 将 表达式格式的cp 转化为 数值格式inp。例如“192.168.2.125”  转化为7d02a8c0。 已废弃*/
in_addr  inet_addr(const char *cp);



/* af 为协议族, 将 表达式格式的src 转化为 数值格式dst。例如“192.168.2.125”  转化为7d02a8c0。 */
int inet_pton(int af, const char *src, void *dst);


/* af 为协议族, 将 数值格式src 转化为 表达式格式的dst。例如 7d02a8c0 转化为 “192.168.2.125”  。 */
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);

示例代码:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    unsigned long   ip_addr;
    ip_addr = inet_addr("192.168.2.125");   //设置ip点分十进制地址的地址
    if(ip_addr==INADDR_NONE)               //  返回值错误判断
        printf("ERROR");
    printf("inet_addr 192.168.2.125 -> %x\n", ip_addr);              //打印转换后的网络字节序 7D02A8C0
    return 0;   
}

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    int ip_addr;
    struct in_addr inet_ip_addr;
    ip_addr = inet_aton("192.168.2.125", &inet_ip_addr);
    if (ip_addr == 0)
    {
        printf("error \n");
        return 0;
    }
    printf("inet_aton 192.168.2.125 -> %x\n",inet_ip_addr.s_addr);    //inet_aton 192.168.2.125 -> 7d02a8c0
    return 0;   
}

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    struct in_addr network;
    network.s_addr=0x7d02a8c0;    //为s_addr赋值--网络字节序
    printf("IP : %s\n", inet_ntoa(network)); //"192.168.2.125"  

    return 0;   
}

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    int ret;
    struct in_addr var_ip;
    
    ret = inet_pton(AF_INET, "192.168.2.125", (void *)&var_ip);
    if(ret==0)
        printf("IP is not contained in address family\n");
    if(ret == -1)
            printf("errno:	EAFNOSUPPORT\n");
    printf("inet_pton 192.168.2.125 -> %x\n",var_ip.s_addr);

    return 0;   
}

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    char ip_buff[INET_ADDRSTRLEN]={0};
    struct in_addr net_ip;
    net_ip.s_addr = 0x7d02a8c0;
    const char *ret;
    
    ret = inet_ntop(AF_INET, (const void *)&net_ip.s_addr, ip_buff, sizeof(ip_buff) );
    if(ret==NULL){                         //  对返回值进行错误判断
        if(strcmp(ret,"EAFNOSUPPORT"))
            perror("AF error:");
        if(strcmp(ret,"ENOSPC"))
            printf("address string over setted size");
    }                                        //   会报警告
    printf("inet_ntop 0x7d02a8c0 -> %s\n", ip_buff);

    return 0;   
}

inet_aton、inet_ntoa、inet_pton和inet_ntop_xiongsiyu979的博客-CSDN博客

IP地址转换函数inet_addr(),inet_aton(),inet_ntoa(),int_pton()_Lurora0的博客-CSDN博客

4- readn writen接口

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值