C++socket网络编程(跨平台)实战HTTP服务器(四)

简介:

  TCP客户端


直接用上次封装的dll动态库,linux则用so文件。首先生成编译一下.

1
2
3
4
5
6
7
#include "XTCP.h"
int  main( int  argc, char *argv[])
{
     XTCP client;
     getchar ();
     return  0;
}

            

           TCP三次握手协议详解

wKioL1lsIbKBhVaxAAED76FIjZA346.png-wh_50


服务器创建,绑定,并且listen开始监听.

客户端也要创建socket,通过这个socket调用connect.他是一个阻塞的

函数,他是要主动打开,他会先发一个SYN J(协议头当中都会包含)过去,然后服务器收到这个

包之后,他会发一个SYN K,回ack J+1回去,然后客户端发送ack k+1过去,然后connect函数返回,服务器收到accept返回.


     为什么要进行三次握手?两次行不行?

为了保证数据能正确传出去,并且能收回来, 但是服务器,收到J

在能不能确定,这是不是正确的J呢,(由于某些特殊原因J发生了变化,服务器就不知道了。)我还是会发一个J+1过去,所以就是,我服务器发送了J+1,你也得回一个K+1给我,确定值是否正确。我才能确定我能

正常发送数据给你,你也能正常发送数据给我。

这些序号,后面所有的包都是往下加,分别标识了连接,

(例如DDOS拒绝服务攻击)就是在Accept(ack K+1)不会给服务器,

然后不断发送连接信号,发多了服务器就会在等待你啊(accept阻塞),这样会导致

服务器全部阻塞。



          XTCP库connect函数封装

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool  XTCP::Connect( const  char  *ip, unsigned  short  port)
{
//如果socket没有创建
if  (m_sock <= 0) CreateSocket();
//连接需要这个结构体
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);   //本地字节序转网络字节序
saddr.sin_addr.s_addr = inet_addr(ip);
if  (connect(m_sock, (sockaddr*)&saddr,  sizeof (saddr)) != 0)
{
printf ( "connect %s:%d failed!:%s\n" ,ip,port, strerror ( errno ));
return  false ;
}
printf ( "connect %s:%d success!\n" , ip, port);
return  true ;
}


客户端只需要只接调用上面的connect就行,不需要绑定等其他操作

#include "XTCP.h"


1
2
3
4
5
6
7
int  main( int  argc, char *argv[])
{
XTCP client;
client.Connect( "192.168.1.125" ,8046);
getchar ();
return  0;
}

wKioL1lsK_SAMOFWAAOGBdl_xX4363.png-wh_50


在linux也很简单了.

makefile:

-std=c++11 使用c++11

-I。。是头文件的路径

-lpthread是linux多线程 

-lsocket是使用到的so库

1
2
client:client.cpp
         g++ $+ -o $@ -std=c++11 -I../../xsocket/xsocket -lpthread -lxsocket

wKioL1lsLqSAwMFVAAIOqiMvxSc686.png-wh_50


这样就成功建立了连接,然后收发数据就很简单了,各自

调用send,recv了。可以试试.


            

          TCP编程总结

wKiom1lsMeqh9skTAAEttYAQPJg179.png-wh_50




 本文转自超级极客51CTO博客,原文链接:http://blog.51cto.com/12158490/1948159,如需转载请自行联系原作者




相关文章
|
1月前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
64 7
|
3天前
|
监控 Linux 测试技术
LabVIEW网络服务器何使用,有哪些不同
LabVIEW网络服务器何使用,有哪些不同
|
1天前
|
网络协议
LabVIEW中如何在网络上使用远程VI服务器
LabVIEW中如何在网络上使用远程VI服务器
|
4天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
13天前
|
存储 数据处理 数据库
|
15天前
|
存储 缓存 网络协议
【专栏】理解并优化DNS设置对于提高网络速度至关重要
【4月更文挑战第28天】本文探讨了DNS服务器是否能加快网络访问速度。DNS负责将域名转换为IP地址,其查询时间、缓存机制和地理位置都影响网络速度。优化DNS配置,如选择快速的公共DNS服务、使用附近的服务器、确保设备正确配置和利用DNS缓存,都能有效提升网络体验。理解并优化DNS设置对于提高网络速度至关重要。
|
15天前
|
监控 负载均衡 网络协议
|
27天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
14 0
|
1月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。