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,如需转载请自行联系原作者




相关文章
|
2月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
60 6
|
7天前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
26 2
|
1月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
62 13
|
2月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
303 10
|
1月前
|
搜索推荐 安全 网络安全
服务器支持HTTPS的时机和条件
【10月更文挑战第23天】服务器支持HTTPS的时机和条件
28 5
|
1月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
2月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
81 1
使用Netty实现文件传输的HTTP服务器和客户端
|
1月前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
67 0
|
3月前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
61 2
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
169 1