补充:

    1-->listen是监听,就是监听你建立的那个socket那个窗口,要是有客户端来了,那么就把他加到 队列里面,然后accept是从队列中取客户端(就是把对应的客人的信息拿过来,交给waiter,它是accept的返回值)

    2-->要是我在监听函数listen后面加上while(1),那么 客户端能够连接上我的服务器吗?====>  答案是能。因为监听是 等客户端来连接,他把客人都放到自己的队列里,而accept是从队列中把客人的信息取出来交给waiter

                          我们虽然没有取客人的过程,但是客人是能接到,只不过接下来服务器和客户端的沟通处理不了了

                    但是我将我的listen(,最大监听数量n) 这个最大监听数量改成1,那么只能有一个客户端能连上服务器,这个n就是服务器能同时连接的最多客户端数量

    3-->listen是往队列中放,accept是从队列中往外取

    4-->那么在listen和accept之间发生了什么?

            TCP连接过程称为 三次握手-->

                          

                    三次握手成功之后,这两个才能通信

      5-->TCP协议头:

        

                  窗口尺寸是因为  TCP有 流量机制

            ~~~~~~~~~~~~~~~~~~~~~~~~·

                  

            TCP那个图,有一个生存周期(8),这个参数  规定,没经过一个路由器  这个参数就减一

       5--->链路层最少需要18个字节,帧头14个字节,帧尾4个字节

               

      6--->滑动窗口:
        

              

      7--->TCP断开连接,就是分手过程-->就是四次挥手

  

              

    8-->

              

基本步骤和搭建UDP服务器步骤一样:
     基本步骤:
      

 我们假设成  我们卖东西

 第一步加载库

 第二步  找个店长卖东西 --->创建socket

 第三步  找个店地   -->绑定bind

 第四步  店长去店门口看  去宣传  有没有人来  --->监听listen

 第五步  人来了  接客  ,交给服务员   --->accept

 第六步  服务员和这个顾客进行对话-->send   和recv
  
  第七步 然后就是 关闭套接字
  
  第八步 卸载库

然后  我们基本的代码;
    

  

 //其实步骤和UDP差不多

 #include<iostream>
#include<Winsock2.h> using namespace std; #pragma comment(lib, "ws2_32.lib") int main()
{ //第一步
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != ) {
printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != ) { printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); //第二步: SOCKET sock=socket(AF_INET ,SOCK_STREAM,IPPROTO_TCP );
if(sock==INVALID_SOCKET)
{
WSACleanup();
return ;
} //第三步 sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons();
server_addr.sin_addr.S_un.S_addr=inet_addr("192.168.3.221"); //第四步
if(bind(sock,(const sockaddr*)&server_addr,sizeof(server_addr))==SOCKET_ERROR)
{
closesocket(sock);
WSACleanup();
return ;
}
//第五步 if(SOCKET_ERROR ==listen(sock,))
{
closesocket(sock);
WSACleanup();
return ;
} //第六步 sockaddr_in rec_addr;
SOCKET sock_waiter;
int size=sizeof(rec_addr);
sock_waiter=accept(sock,(sockaddr*)&rec_addr,&size);
if(sock_waiter==INVALID_SOCKET)
{
closesocket(sock);
WSACleanup();
return ;
} //第七步
char rec_buffer[]={};
if(recv(sock_waiter,rec_buffer,sizeof(rec_buffer),)>)
{
cout<<rec_buffer<<endl;
cin>>rec_buffer;
send(sock_waiter,rec_buffer,sizeof(rec_buffer),);
} //第八步 closesocket(sock);
closesocket(sock_waiter);
WSACleanup();
return ; system("pause");
return ;
}

具体不懂的看手册

然后 这里还有一饿客户端的代码:

 #include<iostream>
#include<Winsock2.h> using namespace std; #pragma comment(lib, "ws2_32.lib") int main()
{ //第一步
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != ) {
printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != ) { printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); //第二步: SOCKET sock=socket(AF_INET ,SOCK_STREAM,IPPROTO_TCP );
if(sock==INVALID_SOCKET)
{
WSACleanup();
return ;
} //第三步 sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("192.168.3.153");
clientService.sin_port = htons(); connect(sock,(SOCKADDR *) & clientService, sizeof (clientService)); //第七步
char rec_buffer[]={}; cin>>rec_buffer;
send(sock,rec_buffer,sizeof(rec_buffer),);
recv(sock,rec_buffer,sizeof(rec_buffer),);
cout<<rec_buffer<<endl; //第八步 closesocket(sock);
WSACleanup();
return ; system("pause");
return ;
}

74)搭建TCP服务器的更多相关文章

  1. netty搭建Tcp服务器实践

    在netty基本组件介绍中,我们大致了解了netty的一些基本组件,今天我们来搭建一个基于netty的Tcp服务端程序,通过代码来了解和熟悉这些组件的功能和使用方法. 首先我们自己创建一个Server ...

  2. netty系列之:来,手把手教你使用netty搭建一个DNS tcp服务器

    目录 简介 搭建netty服务器 DNS服务器的消息处理 DNS客户端消息请求 总结 简介 在前面的文章中,我们提到了使用netty构建tcp和udp的客户端向已经公布的DNS服务器进行域名请求服务. ...

  3. RedHat6.2搭建FTP服务器

    我的环境: A:Red Hat Enterprise 6.2 IP:192.168.16.12 此机作测试端 B:Red Hat Enterprise 6.2 IP:192.168.16.13 此机做 ...

  4. 如何用极路由+OpenWrt+SDR电视棒搭建SDR服务器

    0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SD ...

  5. 自己家里搭建NAS服务器有什么好方案?

    转自:https://www.zhihu.com/question/21359049 作者:陈二发链接:https://www.zhihu.com/question/21359049/answer/6 ...

  6. Windows Server 2003搭建邮件服务器

    Windows Server 2003搭建邮件服务器 由于Windows Server 2003默认是没有安装我们搭建邮件服务器所需要的POP3和SMTP服务的,因此需要我们自己来安装.方法如下: 1 ...

  7. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  8. Mac上搭建直播服务器Nginx+rtmp

    简介 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 步骤安装 1.安装Homebrow Homebrew简 ...

  9. 如何在windows上搭建ftp服务器

    FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件.目前有很多软件都能实现这一功能,然而windows自带的IIS就可以帮助你搭 ...

随机推荐

  1. 易语言加壳SDK(宏标记)

    转载 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310508c31490797634b87834e29938448e435061 ...

  2. 谈谈对MapTask任务分配和Shuffle的理解

    一.切片与MapTask的关系 1.概述 大家要注意区分切片与切块的区别: 切块Block是HDFS物理上把数据分成一块一块的,默认是128M: 数据切片:只是在逻辑上对输入进行分片,并不会在磁盘上分 ...

  3. 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装

    一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...

  4. 对jsp中的js进行调试的方法

    在js中 输入debugger 就可以了

  5. Win10下用selenium、Image.crop() 截图时、坐标不准确的问题

    截百度按钮的图 先将整个窗口的图保存下来 from selenium import webdriver driver = webdriver.Chrome() driver.get('https:// ...

  6. React 学习笔记(2) 路由和UI组件使用

    安装依赖 cnpm install react-router-dom -S // 或 yarn add react-router-dom 导入 // index.js import React fro ...

  7. WCF 异常 The server was unable to process the request due to an internal error.

    实习用的C#,不搞.NET,但且记下. 只有标题中的错误提示,完全不知道哪里出错,要么是Oracle服务器.要么是服务程序,最不愿代码有问题. <behaviors> <servic ...

  8. Node.js NPM Package.json

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json Nod ...

  9. Java中定义常量(Constant) 的几种方法

    为了方便大家交流Spark大数据,浪尖建了微信群,目前人数过多,只能通过浪尖或者在群里的朋友拉入群.纯技术交流,偶有吹水,但是打广告,不提醒,直接踢出.有兴趣加浪尖微信. 常量使用目的 1,为什么要将 ...

  10. 哈希(hash)理解

    转载自https://www.cnblogs.com/mingaixin/p/4318837.html 一.什么是哈希?(一种更复杂的映射) Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就 ...