serverAdd.sin_addr.s_addr
所谓填写IP地址就是指在SOCKADDR_IN结构体中填写IP地址:
- struct sockaddr_in {
- short sin_family;
- u_short sin_port;
- struct in_addr sin_addr;
- char sin_zero[8];
- };
在这里已经定义了 #typedef sockaddr_in SOCKADDR_IN 。该结构中的一个in_addr 结构体 sin_addr 就是要填写的IP地址。in_addr 结构的定义如下(MSDN):
- typedef struct in_addr {
- union {
- struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
- struct { u_short s_w1,s_w2; } S_un_w;
- u_long S_addr;
- } S_un;
- } in_addr;
于是我如同往常填写信息如下:
- SOCKADDR_IN serverAdd;
- unsigned long ipadd;
- m_ServerIp.GetAddress( ipadd ); // m_ServerIp 是一个CIPAddressCtrl 控件,用来读取IP地址
- serverAdd.sin_family = AF_INET; // IP地址家族
- serverAdd.sin_addr.s_addr = htonl(ipadd) ; // 填写IP
- 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):
- struct in_addr {
- union {
- struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
- struct { u_short s_w1,s_w2; } S_un_w;
- u_long S_addr;
- } S_un;
- #define s_addr S_un.S_addr
- /* can be used for most tcp & ip code */
- #define s_host S_un.S_un_b.s_b2
- /* host on imp */
- #define s_net S_un.S_un_b.s_b1
- /* network */
- #define s_imp S_un.S_un_w.s_w2
- /* imp */
- #define s_impno S_un.S_un_b.s_b4
- /* imp # */
- #define s_lh S_un.S_un_b.s_b3
- /* logical host */
- };
serverAdd.sin_addr.s_addr相关推荐
- 由 serverAdd.sin_addr.s_addr 引发的思考
这两天尽忙着看winsock了,玩过它的人都知道正确的填写IP地址是很重要的一个环节.所谓填写IP地址就是指在SOCKADDR_IN结构体中填写IP地址: struct sockaddr_in {sh ...
- socket编程(一)最简单的c/s模式
最简单的C/S模式是经典的入门模式,也是大多数教材讲解最多的,总的来说分为下面的几个步骤 左边为 客户端模式,右边为服务器模式 服务器模式相对复杂一点,这一点是肯定的,因为服务器面对很多不同的客户端的 ...
- 在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址
在编写一些程序时,为了程序可以在其他电脑上也可以使用,而不用手动去更改ip,或者碰到端口不可用的情况.在这里找到了一个好的方法,实际使用也没有问题!故此推荐给大家! 方案: 在构建网络时,使用: cl ...
- Linux环境下的网络编程
本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法,并举了具体代 码实例.要理解本文所谈的技术问题需要读者 ...
- bzero函数_函数模块 | UDP自动获取本地广播地址
让技术·去旅行 点击上方蓝字可以关注我们哦 本文以函数形式做笔记,因为函数模块式编程,可以大大提升代码的可读性. 首先来了解ifreq 这个结构体 1.结构定义 struct ifconf { int ...
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...
- TCP协议的服务器与客户端的程序设计(代码注释超详细)
在上篇博客中讲到了三次握手和四次挥手: Linux网络编程--TCP中的三次握手和四次挥手_神厨小福贵!的博客-CSDN博客服务器编程和客户端编程的大致流程如下:三次握手是在客户端中的connect中 ...
- Linux网络编程实例分析
最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...
- 关于Socket通信客户端是否需要绑定端口号
参见http://blog.chinaunix.net/uid-23193900-id-3199173.html 无连接的socket的客户端和服务端以及面向连接socket的服务端通过调用bind函 ...
最新文章
- GM Tech 2 works with Hummer Yes or No
- 【 MATLAB 】两个序列的卷积和运算的MATLAB实现(2)
- 怎样在Github参与一个开源项目
- 分布式系统——网络监视系统zabbix3.4.2,以及向zabbix中添加被监视主机(一)
- 2016浙江省赛过山车记
- 22行代码AC_试题 历届试题 油漆面积【解题报告】
- C++ 输出调试信息 类似MFC的TRACE等宏
- 客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...
- (数据结构)前缀,后缀以及中缀表达式
- DotNet SSL TLS证书问题分析排障
- java简单纸牌游戏_活动回顾 | 畅玩法语纸牌游戏
- Docker安装稳定版及指定版本
- 密码编码学与网络安全笔记(第7版)
- 自定义结构体及初始化
- 怎么做应力应变曲线_如何用Origin画应力应变曲线 - 图文 -
- [免费分享]微信小程序从入门到精通视频教程 [8.2G]
- ⭐模式匹配与正则表达式
- 招商头条:2018成都快递业中西部第一;合肥高新区30个项目签约125亿;芯盾时代完成3亿元融资
- 使用IDEA完成支付宝开放平台的Demo测试
- 一、JQuery选择器