1. 套接字:是一种通信机制,通过这种机制,客户/服务器系统的开发工作既可以在本机可以络进行。                                   注:套接字的创建和使用与管道是有区别的,套接明确的将客户和服务器区分开来,套接字可以实现将多个客户连接到一个服。
  2. 套接字的连接:你可以把套接字连接想象为一客人找餐馆。顾客提前给美食指南客服打电话,客服接听电话,它转到符合客户要求的一些餐馆(服务器进程),然后再从那里转到客户要点的具体菜的餐馆前台(服务器套接字)。每个进入的电话呼叫(客户)都被转到正确终节点,而中间介入的客服则可以空出来处理后续的电话。                                                                                                                                                                                        服务器端连接的顺序:
  3. (1)socket():创建套接字,服务器应用程序用系统调用socket来创建,它是系统分配给该服务器进程的类似文件描述符的资 源,它不能与其他进程共享。                                                                                                                                  (2)bind():给创建的套接字起名字。本地套接字的名字是Linux文件系统中的文件名,网络套接字的名字是与客户连接的特定网络有关的服务标识符(端口号或访问点)。命名完之后服务器进程就开始等待客户连接到这个命名的套接字。     (3)listen():监听,创建一个队列并将其用于存放来自客户端的进入连接。                                                                 (4)accept():接受客户的连接。注:服务器调用accept时,它会创建一个与原有的命名套接字不同的新套接字。这个套接字只能用于这个特定的客户进行通信,而命名套接字则被保留下来继续处理来自其他客户的连接。对于一个简单的服务器来说,后续的客户将在监听队列中等待,直到服务器再次准备就绪。                                                                          (5)recv()、send():建立连接之后客户端和服务器端开始你一句我一句的聊天。                                                              (6)close():用完一个套接字后,就应该把它删掉,(客户端和服务器端都应该关掉)即使是在程序因接收到一个信号而异常终止的情况下也应该这么做,这可以避免文件系统应充斥着无用的文件而变得混乱。                                                                                                                                                                                        客户端创建连接的顺序:                                                                                                                                                  (1)socket()、(2)connect(): 客户端调用一个未命名套接字和服务器监听套接字之间建立连接的方法连接到服务器就是connect来实现的,要想建立连接就要先进性三次握手,等三次握手完成之后就请求服务器端accept接收连接。
  4. 套接字的属性:域(domain)、类型(type)和协议(protocol)。                                                                                       (1):套接字的域:域指定套接字通信中使用的网络介质。最常见的套接字域书AF_INET,它指的是Internet网络。        注:一般情况下,小于1024的端口号都是为系统服务保留的,并且服务的进程必须具有超级用户权限。

    (2):套接字类型:一个套接字域可能有多种不同的通信方式,而每种通信方式又有其不同的特性,但是AF_UNIX(是一台还未联网的计算机上的套接字)域的套接字没有这样的问题,它们提供了一个可靠的双向通信路径。在网络域中就需要注意底层网络的特性,以及不同的通信机制是如何受到它们的影响的。因特网协议提供了两种通信机制:流、数据报。  1)流套接字:它的行为是可预见的,它提供的是一个有序、可靠、双向字节流的链接。发送的数据可以确保不丢失、复制或乱序到达,并且再这一过程中发生的错误也不会显示出来。大的消息将被分片、传输、再重组。流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP链接实现的。TCP/IP代表的是传输控制协议/网际协议。IP协议是针对数据包的底层协议,它提供从一台计算机通过网络到达另一台计算机的路由。TCP协议提供排序、流控和重传,以确保大数据的传输可以完整地到达目的地或报告一个适当的错误条件。                                                                             2)数据报套接字:与流套接字相反,由SOCK_DGRAM指定的数据包套接字不建立和维持一个链接,可以对发送的数据包长度有限制,数据报可能会丢失、复制或乱序到达。数据报套接字是在AF_INET中通过UDP/IP连接实现的,它提供的是一种无序的、不可靠的服务。从资源角度看,相对来说它们开销较小,因为不需要维持网络连接。因为不需要花费时间来建立连接,所以它们的速度也很快。优点:服务器的崩溃不会给客户造成不便,也不会要求客户重启,因为基于数据报的服务器通常不保留连接信息,所以它们可以再不打扰其客户的前提下通知并重启。

  5. 代码部分:服务器端:

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<string.h>
    #include<assert.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>int main()
    {//创建套接字,并返回一个描述符,该描述符可以访问套接字//AF_INET是IPV4和ARPA因特网指定的协议//第二个参数是通信类型,而此处SOCK_STREAM(流服务),对AF_INET域套接字来说它默认是通过TCP连接来提供这一特性//第三个参数是指定使用的协议,但是通信所使用的协议一般是由套接字的域和套接字类型来决定,通常不需要选择int sockfd = socket(AF_INET,SOCK_STREAM,0);assert(sockfd != -1);//ipv4专用的struct sockaddr_in saddr, caddr; //该结构体指定了自己的ip地址和端口memset(&saddr,0,sizeof(saddr));  //将socket置空//在AF_INET域种,套接字的地址由结构sockaddr_in来指定,头文件netinet/in.hsaddr.sin_family = AF_INET;saddr.sin_port = htons(6000);   //<1024 root saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//自己的ip地址是多少就写多少,用ifconfig查,如果没有192...就用172.0.0.1,//命名套接字作用:通过socket调用创建的套接字可以被其他进程使用listen(sockfd,5);  //创建监听队列,这种机制允许当服务器程序正忙于处理前一个客户请求的时候,将后续的客户连接放入队列等待处理,backlog参数通常是5,举例:假设只有一个门迎,门迎接客之后交接给店内的服务员然后再去迎接下一位客人。while(1){int len = sizeof(caddr);int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//accept函数将创建一个新的套接字来与客户进行通信,并返回新的套接字的描述符。新套接字的类型和服务器监听套接字类型是一样的。//  举例:  accept门迎,c是新的服务员点餐,一个服务员只服务桌客人,每桌服务员会不一样,所以c每次从客户端接收的数据也不一样 c是你和饭店沟通的桥梁那么,c和客户端沟通的桥梁,每个c不一样if(c < 0){continue;}printf("accept(c = %d),ip:%s,port:%d\n",c,inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));char buff[128] = {0};recv(c,buff,127,0);printf("buff = %s\n",buff);send(c,"ok",2,0);close(c);     //一定要关闭它,结束套接字的连接}
    }
    

    客户端:

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<assert.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>int main()
    {  //                                           int sockfd = socket(AF_INET,SOCK_STREAM,0);  //创建套接字,assert(sockfd != -1);struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("192.168.1.102");//指定的是服务器端的,客户端和服务器此处的ip必须一样才能链接成功//(struct sockaddr*)&saddr强转,因为一般用的是通用的地址结构,而本次代码用的IPV4,所以改成IPV4的专用地址结构int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));assert(res != -1); char buff[128] = {0};printf("input:\n");fgets(buff,128,stdin);send(sockfd,buff,strlen(buff),0);//先发送数据,然后清空buff,然后再将收到的数据存放在buffmemset(buff,0,128);recv(sockfd,buff,127,0);printf("buff = %s\n",buff);close(sockfd);
    }

套接字的连接(服务器与客户端一对一的连接)相关推荐

  1. Java 服务器与客户端的简单连接

    今天刚学了一点socket,写了一个服务器与客户端的简单连接 利用的主要就是socket建立连接,发送数据 以下几个方法要注意: Socket(InetAddress  address, int  p ...

  2. 计算机网络实验:套接字及客户服务器应用程序基础(Java实现点对点聊天的实用程序)

    实验名称: 套接字及客户服务器应用程序基础 实验介绍: 本次实验要求自己动手实现一个能够在局域网中进行点对点聊天的实用程序. 实验目的: 熟悉Visual C++的基本操作,亦可采用Java等其它面向 ...

  3. 服务器与客户端的TCP连接

    TCP通讯之服务器与客户端的连接 相关的网站: 一.第一个案例 二.Node.js使用TCP通讯 (一).创建TCP Server (二).创建 TCP Client 三.Node.js 搭建TCP服 ...

  4. Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接<2021SC@SDUSC>

    2021SC@SDUSC Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接 实例要求: Http 协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接. 要求 ...

  5. 炉石传说 账号老是重新连接服务器,炉石传说无法连接服务器怎么办 炉石传说无法连接请检查网络连接是什么原因...

    炉石传说无法连接服务器怎么办?炉石传说无法连接网络怎么办?很多玩家最近都出现了无法连接网络的情况.今天就为大家带来炉石传说无法连接请检查网络连接解决方法! 炉石传说无法连接服务器怎么办 炉石传说无法连 ...

  6. win服务器的远程连接--如何打开远程连接服务器?如何设置远程连接?连接工具?

    如何远程连接服务器,就是把在互联网中的计算机和在局域网中的远程访问服务器相(RAS)连接,从而在RAS和RAC(远程访问客户机,就是在互联网中的某计算机)建立一个虚拟专用线路来直接接入到RAS,连接上 ...

  7. c 套接字服务器端发送消息,从客户端C、服务器Python Issu发送套接字

    我当前的应用程序包括一个C客户机使用TCP将文件发送到Python服务器.它将生成文件的哈希值并将信息发回.我可以让它与python客户机一起工作,但是在将客户机迁移到C时遇到了问题.python服务 ...

  8. MFC基于select模型的套接字类之服务器(1)

    C/S(Client/Server)结构的网络软件分为客户端和服务端.客户端和服务端担任不同的任务.一般来说,客户端将用户的需求提交给服务端,再将服务端返回的结果以一定形式提供给用户.服务端的任务是接 ...

  9. 如何使用MSTSC命令远程连接服务器或客户端

    对于大多数普通管理员来说,大家应当都使用过"远程桌面连接"工具(如下图),通过此工具你可以进行一些最基本的设置(如:显示屏的大小,颜色,本地资源的使用,应用程序的运行等等.),来达 ...

最新文章

  1. 【Flutter】底部导航栏页面框架 ( BottomNavigationBar 底部导航栏 | PageView 滑动页面 | 底部导航与滑动页面关联操作 )
  2. 【oracle】日期加减计算
  3. sql server 修改IDENTITY 字段 的统计当前值
  4. GoogLeNet学习
  5. JavaScript call()函数的应用
  6. UI设计师需要熟记的45个快捷键Windows、Mac
  7. github-markdown-css使用说明
  8. Windows 10 VMware Workstation Server服务启动一段时间后自动异常关闭
  9. java更改文件编码方式_java 更改文件编码
  10. linux下ftp工具
  11. 淘宝购买的ESP-CAM+SD内存卡做一个200W像素的相机arduino IDE开发过程
  12. 春运大幕开启 福建铁路预计发送旅客1575万人次
  13. Pell方程初识以及技巧性的求解Pell方程整数解(附带手推详细证明)
  14. 高维向量的相似度判定-距离产生了,美还在吗
  15. 冷门又实用的Excel技巧知识,还不来看看嘛
  16. xamarin android 微信,转换微信SDK为Xamarin绑定库 Android5.5.8 iOS1.8.6.2
  17. 非线性规划转化为线性规划问题(司守奎老师数模例题)-------数模学习笔记一
  18. 你想象不到的工业智能协议网关还可以这样用
  19. scratch——打砖块
  20. ssm毕设项目贵工程线上拍卖平台的设计与实现c1jil(java+VUE+Mybatis+Maven+Mysql+sprnig)

热门文章

  1. 做短视频千万不要错过这5个视频素材网
  2. 99%的人不知道大数据分析现状是什么,主要的分析技术是什么?
  3. 微信小程序实现举报功能
  4. matplotlib.pyplot.scatter( )绘制散点图与双月形图
  5. 业务分析系列主题:做设计时,怎样理解和构建业务场景闭环?
  6. AWS中IGW,NAT GW以及Egress-only IGW的概念和区别
  7. storm the 少儿英语_storm是什么意思_storm在线翻译_英语_读音_用法_例句_海词词典...
  8. 腾讯云 linux pptpd 搭建 和遇到的部分问题解决
  9. QQ群互通(QQ_Bot)程序配置教程
  10. 200+的AI绘画工具你值得拥有