补充:

    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 ;
}

最新文章

  1. jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化
  2. java核心知识点学习----equals和==的比较、单例模式,饿汉式,饱汉式
  3. 公钥,私钥,SSL(讲的很生动) (转) 对称加密、非对称加密初探
  4. [Unity3D]计时器/Timer
  5. jQuery+PHP实现浏览更多内容
  6. iOS: 填充数据表格
  7. Intellij IDEA安装golang插件
  8. Spark MLlib数据类型
  9. jQuery实现全选、反选和不选功能
  10. 你知道Java的四种引用类型吗
  11. Python_冒泡排序
  12. 【Python】解析Python的缩进规则
  13. 关于php查询mongodb限制返回字段的问题
  14. linux pidstat 命令详解
  15. 10 月 30 日新款 Mac mini 有望与新款 iPad Pro 一起发布
  16. 【亲测】&lt;g++/gcc&gt;CentOS下g++: command not found问题的解决(c++环境安装)
  17. POJ3104--Drying(Binary Search)
  18. spring-service.xml 模板
  19. activiti查询
  20. c++第三十二天

热门文章

  1. 认识json,详解JsonConfig
  2. POJO,JavaBean,entity的理解
  3. MQTT 协议学习:004-MQTT建立通信与 CONNECT 、CONNACK 报文
  4. Docker常用命令,Docker安装Nginx、Redis、Jenkins、tomcat、MySQL
  5. 又一个无效的列类型错误Error setting null for parameter #7 with JdbcType NULL . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLExcept
  6. 洛谷 P3133 [USACO16JAN]Radio Contact G
  7. Maven项目工程目录
  8. Day4-T4
  9. 深入浅出KNN算法
  10. 前端01 HTML5