sockaddr & sockaddr_in strucut

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(在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;
};

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

使用的例子

 1 #define SERVER_PORT 8080
 2 int sockfd,err,newfd;
 3     struct sockaddr_in addr;
 4     sockfd = socket(AF_INET, SOCK_STREAM, 0);
 5     if(sockfd < 0){
 6         perror("socket creation failed!\n");
 7         return;
 8     }
 9     memset(&addr, 0, sizeof(addr));
10     addr.sin_family = AF_INET;
11     addr.sin_port = htons(SERVER_PORT);
12     addr.sin_addr.s_addr = INADDR_ANY;
13     if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
14         perror("socket binding failed!\n");
15         return;
16     }

sockaddr & sockaddr_in strucut

时间: 2024-10-31 06:28:26

sockaddr & sockaddr_in strucut的相关文章

sockaddr/sockaddr_in sockaddr_un详解

首先说一下Unix域协议 Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API(套接口或XTI)的一种方法. 当客户和服务器在同一台主机上时,Unix域协议是IPC通信方式的一种替代品. Unix域提供了两种类型的套接口:字节流套接口(与TCP类似)和数据报套接口(与UDP类似). 14.2. Unix域套接口地址结构 // 在<sys/un.h>头文件中定义的Unix域套接口地址结构struct sockadd

从sockaddr中取得Ip地址和端口号

在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢? 实际上,当sockaddr_in.sin_family = AF_INET时,sockaddr = sockaddr_in. 据此,我们可以做一下转换,就可以利用 inet_ntoa() 来得到ip地址和端口号了: int new_fd = accept(sock, &clientAddr, &

使用C++制作简单的web服务器(续)

增加功能: 1.从文件中读取网页并返回给客户端,而不是把网页代码写死在代码中. 局限: 1.还不能根据URL地址中的参数,访问指定页面 2.仍然是单线程 //***************************************************************************** //@ProjectName ZYhttpd //@Description my http server //@Author NicoleRobin //@Date 2015/02/09

Socket基础编程

地址结构sockaddr_in 其中包含:IP地址,端口号,协议族推荐使用sockaddr_in,而不建议使用sockaddrsockaddr_in与sockaddr是等价的,但sockaddr_in字段更清晰 /* * Socket address, internet style. */ struct sockaddr_in { __uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_a

孙鑫视频VC++深入详解学习笔记

Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Lesson4: 简单绘图 Lesson5: 文本编程 Lesson6: 菜单编程 Lesson7: 对话框编程 Lesson9: 定制应用程序的外观 Lesson10: 绘图控制 Lesson11 图形的保存和重绘 Lesson12 文件操作 Lesson 13: 文档串行化 Lesson14 网络编程 Lesson 15 多线程 Lesson 16 线程同步

【转】Windows Socket TCP/UDP

Windows Socket编程,发现这篇文章不错,就拿过来分享下,转载地址:http://www.cnblogs.com/fantasy-blog/archive/2013/04/21/3033935.html SOCKET网络编程 (WINDOWS SOCKET) 1.前言 网上看了很多Socket的资料,将理解的知识总结下,详细介绍下VC下windows sockets编程,并结合服务器和客户端的两个实例(TCP/UDP)讲解下. 2.SOCKET相关原理 在网络编程中最常用的方案便是Cl

C++的socket编程学习

前言 不得不承认作为一个前端开发,仍有一个后台开发的梦.从socket通信开始学习,在工作之余补充学习点相关知识,记录下学习的过程. PS:有园友可以推荐点相关的书籍吗? 服务端 服务器代码如下,在设置listen之后,通过accept获取对应的socket连接并创建线程进行通信,通信完成后关闭对应线程. // socket_service.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #inc

套接字编程(VC_Win32)

简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以只有在1989年Berkeley大学才能自由地发布自己的操作系统和网络库.Berkeley套接字接口,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程间可以通讯. 它可以在很多不同的输入/输出设备和驱动之上运行,尽管这有赖于操作系统的具体实现. 接口实现用于T

孙鑫视频VC++深入详解学习笔记(全)

Lesson1: Windows程序运行原理及程序编写流程 窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与Lessonecl调用规范的比较,初学者常犯错误及注意事项. 1.       Windows API与Win32 SDK 操作系统提供了各种方便开发Windows应用程序的编程接口,所的函数都在Windows.h头文件中声明.Win32 SDK(Software Development Kit): 即Windows