linux下C语言套接字编程sockaddr和sockaddr_in的区别
tcp建立后,我想linux的服务端可以为每个连接的ip地址分配编号,方便进行每个客户端进行数据交互。所以我要知道每个连接的ip地址。
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。
在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。
网络中的地址包含3个方面的属性:
1 地址类型: ipv4还是ipv6
2 ip地址
3 端口
相应的,头文件有如下定义:
include <netinet/in.h> struct sockaddr { unsigned short sa_family; // 2 bytes address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address
}; // IPv4 AF_INET sockets: struct sockaddr_in { short sin_family; // 2 bytes e.g. AF_INET, AF_INET6 unsigned short sin_port; // 2 bytes e.g. htons(3490) struct in_addr sin_addr; // 4 bytes see struct in_addr, below char sin_zero[8]; // 8 bytes zero this if you want to
}; struct in_addr { unsigned long s_addr; // 4 bytes load with inet_pton()
};
其中sockaddr和sockaddr_in是可以强制转换的
new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);
注释中标明了属性的含义及其字节大小,这两个结构体一样大,都是16个字节,而且都有family属性,不同的是:
sockaddr用其余14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port, sin_addr和sin_zero
分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。
sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:
程序员不应操作sockaddr,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。
一般的用法为:
程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数
网络编程中一段典型的代码为:
int sockfd;
struct sockaddr_in servaddr; sockfd = Socket(AF_INET, SOCK_STREAM, 0); /* 填充struct sockaddr_in */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); /* 强制转换成struct sockaddr */
connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
linux下C语言套接字编程sockaddr和sockaddr_in的区别相关推荐
- TCP/IP网络编程---Linux系统下的TCP套接字编程
目录 第一章 理解网络编程和套接字 1.1 网络编程和套接字概要 1.2 基于Linux的文件操作 1.2.1 底层文件访问和文件描述符 1.2.2 打开文件 1.2.3 关闭文件 1.2.4 将数据 ...
- win客户端与linux服务器C语言套接字socket
windows:(客户端) #include<WINSOCK2.H> #include<STDIO.H> #include<iostream> #include&l ...
- Linux下C语言实现UDP Socket编程
该博文参考了Linux C socket 编程之UDP一文,在这里表示感谢! 发送方: /* * File: udp_sender.c* Author: Henry** Created on 2019 ...
- Linux下C语言实现TCP Socket编程
TCP协议: TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的.可靠的.基于字节流 ...
- python套接字编程_Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...
- Linux 套接字编程中的 5 个隐患
Linux 套接字编程中的 5 个隐患 (2011-05-03 17:50) 分类: Socket编程 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的 ...
- Linux下C语言编程
第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...
- 初识Linux下C语言编程
本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了 ...
- 【Linux】网络基础+UDP网络套接字编程
只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事. 文章目录 一. 网络基础 1.局域网和广域网 2.协议初识和网络协议分层(TCP/IP四层模型) 3.MAC地址和IP地址(子网掩码 ...
最新文章
- 循环神经网络 递归神经网络_如何用递归神经网络预测空气污染
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
- java ajax datatype_理解jquery ajax中的datatype属性选项值
- Exchange 2013/2016动态通讯组成员查询
- 3.3 参数估计:贝叶斯估计
- .NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
- netnbsp;与nbsp;javascript脚本的几种交互方法
- [转载] 民兵葛二蛋——第27集
- 在MacOS系统中如何自定义屏幕保护程序?
- 开源商城小程序源码(小程序商城完整版源码)附搭建部署教程
- nexus3 测试操作
- cnzz.php,PHP curl抓取cnzz统计数据
- 一个域名显示多个服务器ip,一个域名指向多个ip的方法
- 武汉大学java 期末考试试题_武汉大学java期末考试试题和答案
- 算法入门模拟-剪刀石头布
- 常见排序方法 <十种排序方法>
- uni-app中picker组件的“取消”“完成”国际化,能变成英文
- java 文件夹下的文件_java读取某个文件夹下的所有文件
- 寻找指定长度以内的最短连续子段和
- app获取缓存、清理缓存
热门文章
- libcublas.so: cannot open shared object file
- caffe anaconda3 Python.h: 没有那个文件或目录
- python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
- linux perl telnet安装,Perl--Net::Telnet模块
- java 点与线的距离_计算地图上点与线段距离
- pta段错误怎么办_语文名师提醒:错误的阅读习惯导致孩子成绩下降
- 安卓4.4.4安装哪个微信版本_微信一个开关,速度立马提升一倍
- Selenium之鼠标和键盘操作及扩展
- macbook可以装linux,怎样给老旧的 MacBook 安装 Linux
- channelinboundhandler中都包含了哪一类的方法_备考CMA考试有哪些方法技巧?