C函数篇(SOCKADDR_IN数据结构)

基本结构

在windows/linux下有下面结构:

sockaddr结构

struct sockaddr

{

unsigned short sa_family;/*addressfamily,AF_xxx*/

char sa_data[14];/*14bytesofprotocoladdress*/

};

sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族。

sa_data是14字节协议地址

数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构

sockaddr_in(在netinet/in.h中定义):

structsockaddr_in

{

shortsin_family;/*Addressfamily一般来说AF_INET(地址族)PF_INET(协议族)*/

unsignedshortsin_port;/*Portnumber(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/

structin_addrsin_addr;/*Internetaddress*/

unsignedcharsin_zero[8];/*Samesizeasstructsockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/

};

(在ws2def.h中定义)

structsockaddr_in

{

#if(_WIN32_WINNT<0x0600)

shortsin_family;

#else//(_WIN32_WINNT<0x0600)

address_familysin_family;

#endif//(_WIN32_WINNT<0x0600)

ushortsin_port;

in_addrsin_addr;

charsin_zero[8];

}

在linux下:

in_addr结构

typedefstructin_addr

{

unsignedlongs_addr;

};

在windows下:

typedefstructin_addr

{

union

{

struct{unsignedchars_b1,s_b2,s_b3,s_b4;}S_un_b;

struct{unsignedshorts_w1,s_w2;}S_un_w;

unsignedlongS_addr;

}S_un;

}in_addr;

参数说明

sin_family指代协议族,在socket编程中只能是AF_INET

sin_port存储端口号(使用网络字节顺序),在linux下,端口号的范围0~65535,同时0~1024范围的端口号已经被系统使用或保留。

sin_addr存储IP地址,使用in_addr这个数据结构

sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体指针也可以指向

sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,

然后用memset函数初始化就可以了memset((char*)&mysock,sizeof(mysock));//初始化

sockaddr_in mysock;

memset((char*)&mysock,sizeof(mysock));

mysock.sin_family=AF_INET;

mysock.sin_port=htons(1234);//1234是端口号

mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

相关函数:inet_addr, inet_aton, inet_ntoa, htonl, htons, MAKEWORD, WSASocket, WSAHtons……

经典案例

服务端:

int main()

{

//创建socket

intsockfd=socket(PF_LOCAL,SOCK_DGRAM,0);

if(sockfd==-1)

perror("创建socket失败"),exit(-1);

//准备通信地址

structsockaddr_unaddr;

addr.sun_family=PF_UNIX;

strcpy(addr.sun_path,"a.sock");

//绑定

intres=bind(sockfd,(structsockaddr*)&addr,sizeof(addr));

if(res==-1)perror("绑定失败"),exit(-1);

printf("绑定成功\n");

//通信(用读写文件方式)

charbuf[100]={};

read(sockfd,buf,sizeof(buf));

printf("收到信息:%s\n",buf);

//关闭socket

close(sockfd);

return0;

}

客户端:

int main()

{

intsockfd=socket(PF_LOCAL,SOCK_DGRAM,0);

if(sockfd==-1)

perror("创建socket失败"),exit(-1);

structsockaddr_unaddr;

addr.sun_family=PF_UNIX;

strcpy(addr.sun_path,"a.sock");

//连接

intres=connect(sockfd,(structsockaddr*)&addr,sizeof(addr));

if(res==-1)perror("失败"),exit(-1);

printf("成功\n");

write(sockfd,"Hello,Socket!",14);

close(sockfd);

return0;

}

时间: 2024-10-21 15:03:52

C函数篇(SOCKADDR_IN数据结构)的相关文章

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

(四十七)socket编程——socket引入、网络字节序、IP地址转换函数、sockaddr数据结构介绍

一.什么是socket socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,为TCP/

shader 4 杂 一些和函数名词、数据结构

Normal:  法线 Normao mapping: 法线贴图 Lighting mapping: 光照贴图 Bump mapping:     凹凸贴图:模拟粗糙外表面的技术. FX-Water simple.shader中即用到了.模拟波浪效果. Rim lighting: 边缘光照: 在对象的边缘部分添加?亮度. Base Texture, 基础纹理. Detail Texture,细节纹理.与base texture使用同样的uv,可是在material中的Tiling值不同. Cub

函数篇之——函数也是数据

1.  对于JavaScript 来说,有一个概念十分重要——既函数是一种数据类型. 也就是说,下面两种函数定义在本质上是相同的: ① . function f () { return 1; } ② . var f = function () { return 1; } 其中,第二种定义方式通常被叫做函数标识记法(function literal notation). 如果我们对函数变量调用typeof,操作符返回的字符串将会是“function”. >>> var f = functi

函数篇之2——匿名函数

1.  匿名函数实例: >>> function ( a ){ return a; } 匿名函数也就是说没有方法名. 2.  匿名函数的主要用法: 2.1 我们可以将匿名函数作为参数传递给其它函数,这样,接收方函数就能利用我们所传递的函数来完成某些事情. 2.2 我们可以定义某个匿名函数来执行某些一次性任务. 3.  接下来,我们来看具体的应用示例,通过其中的细节来进一步了解匿名函数. 3.1 回调函数 ①.  解释: 当我们将函数A 传递给函数B ,并由B 来执行A 时,A 就成了一个

PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载 中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明,主要掌握各进制转换的方法,以应用于实际开发 一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12); //输出 1100 echo decbin(26); //输出 11010 decbin (PHP 3, PHP

ORACLE基本SQL语句-添加更新数据函数篇

一.添加数据 /*添加数据*/insert into STU values('stu0004','赵一',18,1,"kc0004");insert into STU(STU_ID,STU_NAME,STU_AGE,STU_SET ) values('stu0013','储十一',19,1); 说明:如果不指定将数据添加到那个字段,那么此时必须列出全部数据,如果列出字段,则一一对应,必须列出约束不为空的所有字段,否则报错. 二.更新数据 /*更新数据*/update STU SET S

Python函数篇(7)-正则表达式

1.正则表达式 ??正则表达式为高级的文本模式匹配,抽取,与/或文本形式的搜索和替换功能提供了基础,简单的来说,正则表达式是由一些字符和特殊符号组成的字符串.Python通过标准库中的re模块来支持正则表达式. 2.特殊符号和字符 ??首先介绍一下最常见的特殊符号和字符,即所谓的元字符. 表示法 描述 正则表达式用法示例 literal 匹配文本字符串的字面值literal re.findall("chen","sadchen21") . 匹配任意字符(除了\n之外

30s源码刨析系列之函数篇

前言 由浅入深.逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美. 本系列是对名库 30SecondsOfCode 的深入刨析. 本篇是其中的函数篇,可以在极短的时间内培养你的函数式思维. 内容根据源码的难易等级进行排版,目录如下: 新手级 普通级 专家级 正文 新手级 checkProp const checkProp = (predicate, prop) => obj => !!predicate(obj[prop]); const lengthIs4