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的区别相关推荐

  1. TCP/IP网络编程---Linux系统下的TCP套接字编程

    目录 第一章 理解网络编程和套接字 1.1 网络编程和套接字概要 1.2 基于Linux的文件操作 1.2.1 底层文件访问和文件描述符 1.2.2 打开文件 1.2.3 关闭文件 1.2.4 将数据 ...

  2. win客户端与linux服务器C语言套接字socket

    windows:(客户端) #include<WINSOCK2.H> #include<STDIO.H> #include<iostream> #include&l ...

  3. Linux下C语言实现UDP Socket编程

    该博文参考了Linux C socket 编程之UDP一文,在这里表示感谢! 发送方: /* * File: udp_sender.c* Author: Henry** Created on 2019 ...

  4. Linux下C语言实现TCP Socket编程

    TCP协议: TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的.可靠的.基于字节流 ...

  5. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  6. Linux 套接字编程中的 5 个隐患

    Linux 套接字编程中的 5 个隐患 (2011-05-03 17:50) 分类: Socket编程 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的 ...

  7. Linux下C语言编程

    第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...

  8. 初识Linux下C语言编程

    本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了 ...

  9. 【Linux】网络基础+UDP网络套接字编程

    只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事. 文章目录 一. 网络基础 1.局域网和广域网 2.协议初识和网络协议分层(TCP/IP四层模型) 3.MAC地址和IP地址(子网掩码 ...

最新文章

  1. 循环神经网络 递归神经网络_如何用递归神经网络预测空气污染
  2. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
  3. java ajax datatype_理解jquery ajax中的datatype属性选项值
  4. Exchange 2013/2016动态通讯组成员查询
  5. 3.3 参数估计:贝叶斯估计
  6. .NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记
  7. netnbsp;与nbsp;javascript脚本的几种交互方法
  8. [转载] 民兵葛二蛋——第27集
  9. 在MacOS系统中如何自定义屏幕保护程序?
  10. 开源商城小程序源码(小程序商城完整版源码)附搭建部署教程
  11. nexus3 测试操作
  12. cnzz.php,PHP curl抓取cnzz统计数据
  13. 一个域名显示多个服务器ip,一个域名指向多个ip的方法
  14. 武汉大学java 期末考试试题_武汉大学java期末考试试题和答案
  15. 算法入门模拟-剪刀石头布
  16. 常见排序方法 <十种排序方法>
  17. uni-app中picker组件的“取消”“完成”国际化,能变成英文
  18. java 文件夹下的文件_java读取某个文件夹下的所有文件
  19. 寻找指定长度以内的最短连续子段和
  20. app获取缓存、清理缓存

热门文章

  1. libcublas.so: cannot open shared object file
  2. caffe anaconda3 Python.h: 没有那个文件或目录
  3. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
  4. linux perl telnet安装,Perl--Net::Telnet模块
  5. java 点与线的距离_计算地图上点与线段距离
  6. pta段错误怎么办_语文名师提醒:错误的阅读习惯导致孩子成绩下降
  7. 安卓4.4.4安装哪个微信版本_微信一个开关,速度立马提升一倍
  8. Selenium之鼠标和键盘操作及扩展
  9. macbook可以装linux,怎样给老旧的 MacBook 安装 Linux
  10. channelinboundhandler中都包含了哪一类的方法_备考CMA考试有哪些方法技巧?