求给个windows 下原始套接字的示例程序,要求使用C语言,不使用MFC。

求给个windows 下原始套接字的示例程序,要求使用C语言,不使用MFC。,第1张

#include <Winsock2h>

void main(){

WORD wVersionRequested;

WSADATA wsaData;

WSAStartup( wVersionRequested, &wsaData );

//创建套接字,SOCK_DGRAM套接字类型,0推荐协议

SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);

SOCKADDR_IN addrSrv;

//INADDR_ANY允许套接字向任何分配给本机器的IP地址发送和接收数据,可能有多个网卡

//htonl, 将u_long 从主机字节序转换为网络字节序

addrSrvsin_addrS_unS_addr = htonl(INADDR_ANY);

addrSrvsin_family = AF_INET;//指定地址族

addrSrvsin_port = htons(6002);//端口号,htons,将u_short从主机字节序转换为网络字节序

//绑定

bind(sockSrv, (SOCKADDR)&addrSrv, sizeof(SOCKADDR));

while(1){

//等待接收数据

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR)&addrClient, &len);

}

现在一般使用inet_aton和inet_ntoa来处理网络字节和主机字节之间的转换;

有两个更新的函数inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6,原型如下

#include <sys/typesh>

#include <sys/socketh>

#include <arpa/ineth>

int inet_pton(int af, const char src, void dst);

这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中

inet_pton 是inet_addr的扩展,支持的多地址族有下列:

AF_INET

src为指向字符型的地址,即ASCII的地址的首地址(dddddddddddd格式的),函数将该地址

转换为in_addr的结构体,并复制在dst中

AF_INET6

src为指向IPV6的地址,,函数将该地址

转换为in6_addr的结构体,并复制在dst中

如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。

函数inet_ntop进行相反的转换原型如下

#include <sys/typesh>

#include <sys/socketh>

#include <arpa/ineth>

const char inet_ntop(int af, const void src, char dst, socklen_t cnt);

这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和上面相同,只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC

小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端;

大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端;

网络字节序是大端字节序,平常的PC机器上是小端字节序

需要转换下,可以用htons()函数做转换 将主机字节序转换为网络上用的字节序

int 和 long 都可以用htons()函数做转换

float型的一般来说,编译器是按照IEEE标准解释的,即把float/double看作4/8个字符的数组进行解释。因此,只要编译器是支持IEEE浮点标准的,就不需要考虑字节顺序。

如果你实在不放心,可以采取下面两种办法:

(1)在保证不超过int范围的情况下,将浮点数乘以100(或1000,10000,视所需精度随你定)转换为整数传输,在接收端再除以100,得到浮点数。

(2)将浮点数转换为字符串传输,由于字符串是一个字节一个字节的流,就不会有字节顺序的问题了。

ntohs()

网络字节序->主机字节序

网络字节序规定了数据在网络中传输的字节顺序,各主机再根据自身的环境将网络字节序转换成适应自身的主机字节序。

数值:0x1245

在X86系统中这样存储

内存地址 数据

00 12

01 45

发送时从低地址读取数据

所以发送顺序为 12 45

而在其它系统中有可能这样存储:

内存地址 数据

00 45

01 12

如果不转换为网络字节序,按 45 12发送,则X86系统就理解为0x4512了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/12187004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存