`
从此醉
  • 浏览: 1046204 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解

 
阅读更多

sockaddr

struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构

sockaddr_in

sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr;
};

typedef struct in_addr {
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
} S_un;
} IN_ADDR;

sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
mysock结构体名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
……
等到要做转换的时候用:
(struct sockaddr*)mysock


sockaddr_un

进程间通信的一种方式是使用UNIX套接字,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。这样做可以避免为黑客留下后门。

创建
使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:
int sockfd;
sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);

绑定
创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。通常将文件放在/tmp目录下。例如:

struct sockaddr_un sun;
sun.sun_family = AF_LOCAL;
strcpy(sun.sun_path, filepath);
bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));

监听
本地套接字的监听、接受连接操作与网络套接字类似。

连接
连接到一个正在监听的套接字之前,同样需要填充struct sockaddr_un结构,然后调用connect函数。

连接建立成功后,我们就可以像使用网络套接字一样进行发送和接受操作了。甚至还可以将连接设置为非阻塞模式,这里就不赘述了。


分享到:
评论

相关推荐

    Linux C中sockaddr和sockaddr_in的区别

    主要介绍了Linux C中sockaddr和sockaddr_in的区别的相关资料,需要的朋友可以参考下

    Linux网络编程 Socket UDP形式(包括服务器端和接收端)

    struct sockaddr_in my_addr; //服务器网络地址结构体 struct sockaddr_in their_addr; //客户端网络地址结构体 int sin_size; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(1);...

    基于TCP的服务器客户端编程讲解.doc

    " "以IPv4套接口地址结构为例,它以"sockaddr_in"命名,定义在头文件<netinet/in.h" ">;以下是结构体的内容: " "struct in_addr " "{ " " in_addr_t s_addr; " "}; " "struct sockaddr_in { " " uint8_t sin_...

    socket linux2

    struct sockaddr_in server_sockaddr,client_sockaddr;//定义保存socket信息的结构体 //配置机构体信息 server_sockaddr.sin_family=AF_INET;//协议族使用tcp/ip server_sockaddr.sin_port=htons(PORT);//设置...

    嵌入式系统设计与应用课程设计报告.doc

    (2)、掌握嵌入式linux下基础网络编程:socket编程 (3)、独立编写客户机/服务器通信程序; 二、开发环境 (1) 编程环境:在Linux开发环境下设计及编译C语言程序。 (2) 硬件设备:PXA270开发板,PC机。 三、设计...

    网络编程常用函数接口

    通用结构体: struct sockaddr { sa_family_t sa_family; /* unsigned short , 指定了通信协议家族 */ char sa_data[14]; };

    客户服务器程序设计及实现.doc

    其它:没有错误,bind()返回0,否则SOCKET_ERROR 地址结构说明: struct sockaddr_in { short sin_family;//AF_INET u_short sin_port;//16位端口号,网络字节顺序 struct in_addr sin_addr;//32位IP地址,网络字节...

    标准MFC WinSock ActiveX控件开发实例

    memset(&addr, 0, sizeof(struct sockaddr_in)); // 设定 SOCKADDR_IN 结构的内容 // 如果通讯协议是选择IP Protocol,那此值固定为AF_INET // AF_INET 与 PF_INET 这两个常量值相同 addr.sin_family = AF_INET...

    kerberos报告1

    声明了如下宏和函数:客户端主函数结构如下:* @return sockaddr_in 结构体* 判断响应是否有效* @param response char*

    TCP/IP协议分析:arp抓包程序

    在Linux下进行arp抓包实验 #include #include <stdlib.h>//某些结构体定义和宏定义,如...#include <sys/socket.h>//与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等

    网络程序设计复习题.doc

    1.什么叫套接字?套接字按通信性质可以分为哪两类? 多个 TCP 连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。... 4、为什么在数据结构struct sockaddr_in中,成员变量sin_addr和sin_port需要转换为网

    TCP通信案例与模型详解.7z

    本文档主要包含TCP通信的客户端和服务端的程序代码,使用C语言编写的。内容注释详细,并且包含了sockaddr结构体的详细分析。

    Tcp_RecvAndSend.zip

    将一本地地址与一套接口捆绑 // sockfd 表示已经建立的socket编号(描述符); // my_addr 是一个指向sockaddr结构体类型的指针; // 参数addrlen表示my_addr结构的长度

    各种文件格式的传输

    int CMyQQDlg::SaveYouFiles(CSocket &recSo, SOCKADDR_IN &client) { CString fnames; CString filenamepath; static int filescount=0; CString strfileIp,strfileName,strfileLength; char filemes[512]={0}...

    Sock-webView:通过socket显示网页到webView

    Socket初探 socket原始方式获取网络数据展现到webView ... 2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址 服务器的"结构体"地址 提示:C 语言中没有对象 3> 结构体数据长度 0 成功/其他 错误代号,

Global site tag (gtag.js) - Google Analytics