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三次握手协议详解
服务器创建,绑定,并且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;
}
|
在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
|
这样就成功建立了连接,然后收发数据就很简单了,各自
调用send,recv了。可以试试.
TCP编程总结