所谓填写IP地址就是指在SOCKADDR_IN结构体中填写IP地址:

  1. struct sockaddr_in {
  2. short   sin_family;
  3. u_short sin_port;
  4. struct  in_addr sin_addr;
  5. char    sin_zero[8];
  6. };

在这里已经定义了 #typedef sockaddr_in  SOCKADDR_IN  。该结构中的一个in_addr 结构体 sin_addr 就是要填写的IP地址。in_addr 结构的定义如下(MSDN):

  1. typedef struct in_addr {
  2. union {
  3. struct {      u_char s_b1,s_b2,s_b3,s_b4;    } S_un_b;
  4. struct {      u_short s_w1,s_w2;    } S_un_w;
  5. u_long S_addr;
  6. } S_un;
  7. } in_addr;

于是我如同往常填写信息如下:

  1. SOCKADDR_IN serverAdd;
  2. unsigned long ipadd;
  3. m_ServerIp.GetAddress( ipadd );    //  m_ServerIp 是一个CIPAddressCtrl 控件,用来读取IP地址
  4. serverAdd.sin_family = AF_INET;  // IP地址家族
  5. serverAdd.sin_addr.s_addr = htonl(ipadd) ;  // 填写IP
  6. serverAdd.sin_port = htons(m_ServerPort);  // 填写端口

这里的serverAdd.sin_addr.s_addr = htonl(ipadd) ; 引起了我的困惑,本应该是serverAdd.sin_addr.S_un.S_addr = htonl(ipadd) ; 这样才对嘛,怎么就直接访问union里面的成员呢S_addr(当时还没有看出大小写问题)? 看了半天,也在网上查了半天没有结果。最后眼睛就直勾勾的看着这行的最后一个s_addr  ,突然发现s原来是小写的,呵呵,查看定义(winsock2.h):

  1. struct in_addr {
  2. union {
  3. struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
  4. struct { u_short s_w1,s_w2; } S_un_w;
  5. u_long S_addr;
  6. } S_un;
  7. #define s_addr  S_un.S_addr
  8. /* can be used for most tcp & ip code */
  9. #define s_host  S_un.S_un_b.s_b2
  10. /* host on imp */
  11. #define s_net   S_un.S_un_b.s_b1
  12. /* network */
  13. #define s_imp   S_un.S_un_w.s_w2
  14. /* imp */
  15. #define s_impno S_un.S_un_b.s_b4
  16. /* imp # */
  17. #define s_lh    S_un.S_un_b.s_b3
  18. /* logical host */
  19. };

serverAdd.sin_addr.s_addr相关推荐

  1. 由 serverAdd.sin_addr.s_addr 引发的思考

    这两天尽忙着看winsock了,玩过它的人都知道正确的填写IP地址是很重要的一个环节.所谓填写IP地址就是指在SOCKADDR_IN结构体中填写IP地址: struct sockaddr_in {sh ...

  2. socket编程(一)最简单的c/s模式

    最简单的C/S模式是经典的入门模式,也是大多数教材讲解最多的,总的来说分为下面的几个步骤 左边为 客户端模式,右边为服务器模式 服务器模式相对复杂一点,这一点是肯定的,因为服务器面对很多不同的客户端的 ...

  3. 在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址

    在编写一些程序时,为了程序可以在其他电脑上也可以使用,而不用手动去更改ip,或者碰到端口不可用的情况.在这里找到了一个好的方法,实际使用也没有问题!故此推荐给大家! 方案: 在构建网络时,使用: cl ...

  4. Linux环境下的网络编程

    本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法,并举了具体代  码实例.要理解本文所谈的技术问题需要读者 ...

  5. bzero函数_函数模块 | UDP自动获取本地广播地址

    让技术·去旅行 点击上方蓝字可以关注我们哦 本文以函数形式做笔记,因为函数模块式编程,可以大大提升代码的可读性. 首先来了解ifreq 这个结构体 1.结构定义 struct ifconf { int ...

  6. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  7. TCP协议的服务器与客户端的程序设计(代码注释超详细)

    在上篇博客中讲到了三次握手和四次挥手: Linux网络编程--TCP中的三次握手和四次挥手_神厨小福贵!的博客-CSDN博客服务器编程和客户端编程的大致流程如下:三次握手是在客户端中的connect中 ...

  8. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  9. 关于Socket通信客户端是否需要绑定端口号

    参见http://blog.chinaunix.net/uid-23193900-id-3199173.html 无连接的socket的客户端和服务端以及面向连接socket的服务端通过调用bind函 ...

最新文章

  1. GM Tech 2 works with Hummer Yes or No
  2. 【 MATLAB 】两个序列的卷积和运算的MATLAB实现(2)
  3. 怎样在Github参与一个开源项目
  4. 分布式系统——网络监视系统zabbix3.4.2,以及向zabbix中添加被监视主机(一)
  5. 2016浙江省赛过山车记
  6. 22行代码AC_试题 历届试题 油漆面积【解题报告】
  7. C++ 输出调试信息 类似MFC的TRACE等宏
  8. 客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...
  9. (数据结构)前缀,后缀以及中缀表达式
  10. DotNet SSL TLS证书问题分析排障
  11. java简单纸牌游戏_活动回顾 | 畅玩法语纸牌游戏
  12. Docker安装稳定版及指定版本
  13. 密码编码学与网络安全笔记(第7版)
  14. 自定义结构体及初始化
  15. 怎么做应力应变曲线_如何用Origin画应力应变曲线 - 图文 -
  16. [免费分享]微信小程序从入门到精通视频教程 [8.2G]
  17. ⭐模式匹配与正则表达式
  18. 招商头条:2018成都快递业中西部第一;合肥高新区30个项目签约125亿;芯盾时代完成3亿元融资
  19. 使用IDEA完成支付宝开放平台的Demo测试
  20. 一、JQuery选择器

热门文章

  1. 计算机网络(一)——计算机网络基础
  2. 苹果微信浏览器html缓存图片吗,h5清理微信浏览器网页缓存
  3. No boot filename received
  4. 知识图谱构建软件Protege下载使用
  5. TCP套接口热迁移REPAIR模式
  6. 杭电OJ 1159(C++)
  7. Spring Cloud H SR5集成 Jaeger
  8. APP网络测试要点及弱网模拟
  9. iOS 13 适配,关闭黑暗模式(夜间模式)
  10. [python] 圆形嵌套图Circular Packing