TCP通信过程介绍

首先介绍一下socket通信的基本过程:这里先如果有两个家伙在通信,一个是S。还有一个叫C

(1)S打开port监听本地的port看看有没有人来连接;

(2)与此同一时候C试图去连接远程的S。连接的地址就是S的地址加上S监听的port号;

(3)S收到C的请求之后,建立连接,两方共同持有连接的通道。可互相发送/接收数据随意次。此时S和C无差别。

(4)当中一方断开连接,或者由于网络原因中断连接,还有一方也会关闭;

(5)此时通信过程结束;

整个步骤例如以下图所看到的

普通ACE通信类ACE_SOCK_*通信过程

ACE_SOCK_Connector  ACE_SOCK_Stream  ACE_SOCK_Acceptor完毕上面的通信过程:

TimerServer Edition 1.0  单次发送

两方建立连接》互发数据》关闭连接

Client:发送自己的签名给Server之后就准备接受Server发来的时间

Server:在连接建立后打印对方发来的签名。之后回复自己的时间给对方

Server  端 time_server_main.cpp

#include <ace/OS.h>
#include <ace/ACE.h>
#include <ace/Log_Msg.h>
#include <ace/SOCK_Acceptor.h>
#include "ace/Date_Time.h" int main(int argc, char *argv[])
{
ACE_INET_Addr addr(1500);
ACE_SOCK_Acceptor server;
ACE_SOCK_Stream stream; //启动监听
if(server.open(addr)==-1)
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500失败\n")));
return 1;
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500成功\n")));
} char msg[1000]; //建立链接
if(server.accept(stream)!=-1)
{
ACE_INET_Addr raddr;
stream.get_remote_addr(raddr);
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接成功 %s %d\n"),raddr.get_host_addr(),raddr.get_port_number())); if(stream.recv(msg,sizeof(msg)-1)==-1) // just call socket recv
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server recv failed\n")));
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server recv : %s\n"),msg));
//get current time
ACE_Date_Time date;
sprintf(msg,"%ld-%ld-%ld %02ld:%02ld:%02ld:%02ld",date.year(),date.month(),date.day(),date.hour(),date.minute(),date.second(),date.microsec());
//发送数据
stream.send_n(msg,sizeof(msg));
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("发送当前时间%s至 %s %d\n"),msg,raddr.get_host_addr(),raddr.get_port_number()));
}
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接失败\n")));
}
//关闭链接
stream.close();
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server链接关闭了\n")));
server.close(); return 0;
}

Client端time_client_main.cpp

#include "ace/OS.h"
#include <ace/OS_main.h>
#include <ace/ACE.h>
#include <ace/Log_Msg.h>
#include <ace/SOCK_Connector.h> int main(int argc, char *argv[])
{
ACE_INET_Addr addr(1500,"127.0.0.1"); //remote address
ACE_SOCK_Connector con; // connetor for socket client
ACE_SOCK_Stream stream; // stream is for socket read/write //建立链接
if(con.connect(stream,addr)==-1) //connect to remote address
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接失败\n")));
return 1;
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接成功\n")));
} const char msg[] = "Hello,ACE!";
//发送数据
stream.send_n(msg,sizeof(msg)); // send_n function send exactly n bytes char buffer[1024] = {0};
//接收数据
if(stream.recv(buffer,sizeof(buffer)-1)==-1) // just call socket recv
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv failed\n")));
return 1;
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv:%s\n"),buffer));
} //断开链接
if (stream.close () == -1) //close the connection
{
ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close failed\n")));
return 1;
}
else
{
ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close successed\n")));
}
return 0;
}

输出:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FsbXJlYXNvbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

TimerServer Edition 2.0  多次发送

两方建立连接》互发数据》关闭连接

(1)Client:发送自己的签名给Server之后就准备接受Server发来的时间,此过程反复三次

(2)Server:在连接建立后打印对方发来的签名。之后回复自己的时间给对方。此过程直到对方关闭链接

Server  端 time_server_main.cpp

#include <ace/OS.h>
#include <ace/ACE.h>
#include <ace/Log_Msg.h>
#include <ace/SOCK_Acceptor.h>
#include "ace/Date_Time.h" int main(int argc, char *argv[])
{
ACE_INET_Addr addr(1500);
ACE_SOCK_Acceptor server;
ACE_SOCK_Stream stream; //启动监听
if(server.open(addr)==-1)
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500失败\n")));
return 1;
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500成功\n")));
} char msg[1000]; //建立链接
if(server.accept(stream)!=-1)
{
ACE_INET_Addr raddr;
stream.get_remote_addr(raddr);
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接成功 %s %d\n"),raddr.get_host_addr(),raddr.get_port_number())); while(stream.recv(msg,sizeof(msg)-1)!=-1) // just call socket recv
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server recv : %s\n"),msg));
//get current time
ACE_Date_Time date;
sprintf(msg,"%ld-%ld-%ld %02ld:%02ld:%02ld:%02ld",date.year(),date.month(),date.day(),date.hour(),date.minute(),date.second(),date.microsec());
//发送数据
stream.send_n(msg,sizeof(msg));
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("发送当前时间%s至 %s %d\n"),msg,raddr.get_host_addr(),raddr.get_port_number()));
ACE_OS::sleep(1);
}
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接失败\n")));
}
//关闭链接
stream.close();
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server链接关闭了\n")));
server.close(); return 0;
}

Client端time_client_main.cpp

#include "ace/OS.h"
#include <ace/OS_main.h>
#include <ace/ACE.h>
#include <ace/Log_Msg.h>
#include <ace/SOCK_Connector.h> int main(int argc, char *argv[])
{
ACE_INET_Addr addr(1500,"127.0.0.1"); //remote address
ACE_SOCK_Connector con; // connetor for socket client
ACE_SOCK_Stream stream; // stream is for socket read/write //建立链接
if(con.connect(stream,addr)==-1) //connect to remote address
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接失败\n")));
return 1;
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接成功\n")));
} const char msg[] = "I'm Client ABC";
//发送数据
int n=3;
for (int i=0; stream.send_n(msg,sizeof(msg)) != -1 && i<3;++i)
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client send successed\n"))); char buffer[1024] = {0};
//接收数据
if(stream.recv(buffer,sizeof(buffer)-1)==-1) // just call socket recv
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv failed\n")));
return 1;
}
else
{
ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv:%s\n"),buffer));
}
ACE_OS::sleep(1);
} //断开链接
if (stream.close () == -1) //close the connection
{
ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close failed\n")));
return 1;
}
else
{
ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close successed\n")));
}
return 0;
}

TimerServer Edition 2.0  多次发送

多个client分多次发送

最新文章

  1. eclipse启动tomcat, http://localhost:8080无法访问
  2. DIY一个前端模板引擎.(一)
  3. sax 解析 xml
  4. BZOJ4519——[cqoi2016]不同的最小割
  5. 5.echo(),print(),print_r()的区别
  6. kuangbin_MST B (POJ 1287)
  7. shell脚本去重的几种方法
  8. 使用webstorm操作git
  9. httpwatch 9.3怎么在ie 8上看不到
  10. jQuery的类数组对象结构
  11. 【LeetCode】29. Divide Two Integers
  12. GIS制图人员的自我修养(2)--制图意识
  13. 最近做的floyd的题目
  14. Java泛型类和泛型方法
  15. 进行API开发选gRPC还是HTTP APIs?
  16. 【Android Studio安装部署系列】十五、Android studio添加Assets目录
  17. PHP奇淫技巧
  18. java 接口详解
  19. Java Socket NIO
  20. face detection[Face R-CNN]

热门文章

  1. web api初学
  2. vue 中展示PDF内容
  3. favourite和favorite的区别
  4. ssh项目导入报the import javax.servlet cannot be resolved
  5. 字符串String的理解
  6. Kotlin实例----android5.0新特性之palette
  7. ionic2 打包时报错 file-opener2
  8. JS——缓慢动画封装
  9. html——特例
  10. eclipse安装python开发pydev插件