热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

socket编程之一:入门篇

作为一名初学者,和大家一样,对网络这个东西敬之迷之却又惑之。对我而言,最爽的就是弄懂那些自己不知道的东西了。那么,咱么就一起学习socket编程吧!一、主机地址、ip地址、网络号、主机号、域

作为一名初学者,和大家一样,对网络这个东西敬之迷之却又惑之。对我而言,最爽的就是弄懂那些自己不知道的东西了。那么,咱么就一起学习socket编程吧!

 

一、主机地址、ip地址、网络号、主机号、域名 WTF?

首先,设备想要在互联网的大海里遨游就必须的有一个自己在这个圈子里唯一的标识,这就是ip地址,一般来说,ip地址具有唯一性,就像在学校里你的学号是独一无二的一样。ip地址包括网络号和主机号两个部分,比如百度的ip:123.125.115.110,前三段(123.125.115)即是它的网络号,最后一段(110)就是它的主机号。由于ip地址这一堆堆的数字老是让人记不住,所以机智的人类发明了域名。域名和ip可以是一一对应,也可以是一个域名对应多个ip(比如百度就有两个ip,但是只有一个baidu.com域名)。ip地址就是主机地址。

二、ip地址在计算机里是如何存储的?

说白了,ip就是一串数字,目前为止是32bit的无符号数。

三、网络是怎样连通的?

在数据传输的过程中,必定存在两端,一端发送数据,一端接收数据,因此出现了客户端和服务器,但不是说客户端就一定只能接收数据,服务器就只能发送数据,在通信时,往往两端都有在发送和接受数据。这里要特别注意一点:客户端和服务器并不单纯的只是两台设备,他们是两个进程。换句话说,一台设备上可能跑多个客户端或者多个服务器。网络就是依靠两端的某些信息而建立的,包含这些信息的结构叫做套接字对,而这些信息本身就是套接字。套接字包含了主机地址和端口号。处于客户端的套接字成为客户端套接字,处于服务器端的套接字称为服务器套接字。当两台设备想要连接起来以便通信时,我们可以调用 套接字接口 来让他们完成“交易”结合成对,当“交易”完成时,他们就可以愉快的相互“说话”了。

四、套接字接口

套接字接口分为客户端套接字接口和服务器端套接字接口。

客户端套接字接口:getaddrinfo()、socket()、connect()、rio_writen()、rio_readlineb()、close()

服务器端套接字接口:getaddrinfo()、socket()、bind()、listen()、accept()、rio_readlineb()、rio_writen()、close()

当然,套接字接口还不止这些,这些只是完成客户端与服务器相互连通并进行简单的数据传输所用到的套接字接口。

五、小试身手

了解到这,我们可以来做一个小实验,来看看百度域名到底映射了多少ip。

第一步:我们得进行socket版本协商,初始化socket;

第二步:填充addrinfo结构体(结构体的具体细节百度吧,这里就不贴了)

第三步:根据域名获取映射ip存于addrinfo链表中

第四步:获取域名的数字地址字符串

第五步:为了养成良好的编程习惯,切不要忘了结束时应该释放内存

搞定!哦,对了,差点忘了贴代码了...

 1 #include 
 2 #include 
 3 #pragma comment(lib,"ws2_32.lib")
 4 
 5 int main(int argc, char* argv[])
 6 {
 7     const int MAXLINE = 2048;
 8     struct addrinfo *p, *listp, hints;
 9     char buf[MAXLINE];
10     int rc, flags;
11 
12     //第一步:进行socket版本协商并初始化socket(使用socket函数之前的必要步骤)
13     WORD wVersionRequested;
14     WSADATA wsaData;
15     int err;
16 
17     wVersiOnRequested= MAKEWORD(1, 1);
18 
19     err = WSAStartup(wVersionRequested, &wsaData);
20     if (err != 0) {
21         /* Tell the user that we could not find a usable */
22         /* WinSock DLL.   */
23         return 0;
24     }
25 
26     /* Confirm that the WinSock DLL supports 1.1.*/
27     /* Note that if the DLL supports versions greater */
28     /* than 1.1 in addition to 1.1, it will still return */
29     /* 1.1 in wVersion since that is the version we */
30     /* requested.   */
31 
32     if (LOBYTE(wsaData.wVersion) != 1 ||
33         HIBYTE(wsaData.wVersion) != 1) {
34         /* Tell the user that we could not find a usable */
35         /* WinSock DLL.   */
36         int vl = LOBYTE(wsaData.wVersion);
37         int vh = HIBYTE(wsaData.wVersion);
38         return 0;
39     }
40 
41     /* The WinSock DLL is acceptable. Proceed. */
42 
43     /*if (argc != 2)
44     {
45         fprintf(stderr, "usage:%s \n", argv[0]);
46         exit(0);
47     }*/
48 
49     //end
50 
51     char name[50];
52     std::cin >> name;
53 
54     //第二步:填充addrinfo结构体
55     memset(&hints, 0, sizeof(struct addrinfo));
56     hints.ai_family = AF_INET;
57     hints.ai_socktype = SOCK_STREAM;
58     //end
59 
60     //第三步:根据域名name获取映射ip存于listp中
61     if ((rc = getaddrinfo(name, NULL, &hints, &listp)) != 0)
62     {
63         std::cout <<"getaddrinfo error:" < std::endl;
64         WSACleanup();
65         return 0;
66     }
67     //end
68 
69     //第四步:获取域名的数字地址字符串
70     flags = NI_NUMERICHOST;
71     for (p = listp; p; p = p->ai_next)
72     {
73         getnameinfo(p->ai_addr, p->ai_addrlen, buf, MAXLINE, NULL, 0, flags);
74         std::cout < std::endl;
75     }
76     //end
77 
78     //第五步:释放listp(由于较小所以可以忽略,只是为了养成良好的编程习惯最好加上)
79     freeaddrinfo(listp);
80     //end
81     system("pause");
82     WSACleanup();
83     return 0;
84 }

说明:本代码基于vs2015调试运行成功。由于DEV C++中不认识#pragma,因此在DEV C++中不能运行。还请注意,windows下,套接字接口包含于头文件中,同时还应将其配套的库“ws2_32.lib”一起包含在程序里,不然会出现这个情况:

//error LNK2019: 无法解析的外部符号 __imp__WSAStartup@8,该符号在函数 _main 中被引用

在linux下,头文件为

入门篇结束~待续...

 


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
author-avatar
安宁日月_860
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有