现在我们要开始进行客户端的编码了。
如下客户端代码:

#include "XTcp.h"
int main()
{XTcp client;   //client创建之后要建立连接,第一步客户端和服务器都是一样的,//区别是第二步,客户端有需要connect去连接服务器有一个三次握手的过程client.Connect("192.168.16.223", 8081);client.Send("clientyesyesyes", 20);char buffer[1024] = { 0 };client.Recv(buffer,sizeof(buffer));printf("%s\n", buffer);return 0;
}

分析上面的代码,三次握手在客户端Connect之后,服务器accept时就已经完成。三次握手流程如下图。

通用流程代码XTcp.cpp

#include "XTcp.h"
#ifdef WIN32
#include <Windows.h>
#define socklen_t int
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define closesocket close
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <thread>using namespace std;XTcp::XTcp()
{
#ifdef WIN32static bool first = true;if (first){first = false;    //保证只进入一次WSADATA ws;WSAStartup(MAKEWORD(2, 2), &ws); //相当于加载了动态库,给引用增加1,这个只需要调用以此,但是需要调用在最前面}#endif
}int XTcp::CreateSocket()    //第一步创建socket
{sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("create socket failed!\n");}return sock;
}bool XTcp::Bind(unsigned short port)
{if (sock <= 0)CreateSocket();//创建sockaddr_in saddr;saddr.sin_family = AF_INET;   //协议saddr.sin_port = htons(port); //本地字节序转换为网络字节序saddr.sin_addr.s_addr = htonl(0);   //任意ip地址发过来的数据都接收//绑定//用bind绑定,绑定哪一个端口if (::bind(sock, (sockaddr*)&saddr, sizeof(saddr)) != 0){printf("bind port %d failed!\n", port);return false;}printf("bind port %d success!\n", port);listen(sock, 10);    //这个函数已经调用,就会告诉系统,这个socket可以通过这//个端口来跟它进行接收连接了//但是,连接的信息还会用到另外一个函数。10指的是在我这次获取连接信息的时候//最大支持多少个连接信息return true;
}int XTcp::Recv(char* buf, int bufsize)
{//Revc考虑一点,有时候需要接收指定大小,接收不到指定大小,就会失败return recv(sock, buf, bufsize, 0);
}int XTcp::Send(const char* buf, int size)
{int s = 0;while(s!=size)   //一直发送,直到发送完毕{int len = send(sock, buf + s, size - s, 0);if (len <= 0)break;s += len;}return s;
}void XTcp::Close()
{if (sock <= 0)return;closesocket(sock);
}XTcp XTcp::Accept()
{XTcp tcp;sockaddr_in caddr;socklen_t len = sizeof(caddr);int client = accept(sock, (sockaddr*)&caddr, &len);//创建一个新的socket,用来与客户端单独进行通信if (client <= 0)return tcp;        //如何让外部知道我accept是成功还是失败,可以通过这个返回对象的默认socket来判断printf("accept client %d\n", client);tcp.ip = inet_ntoa(caddr.sin_addr);tcp.port = ntohs(caddr.sin_port);       //将网络字节序转化为本地字节序tcp.sock = client;printf("client ip is %s,port is %d\n", tcp.ip.c_str(), tcp.port);return tcp;
}bool XTcp::Connect(const char* ip, unsigned short port)
{if (sock <= 0)CreateSocket();sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(port);                 //本地字节序转换为网络字节序saddr.sin_addr.s_addr = inet_addr(ip);   //将字符串类型转化为整数类型的ip地址if (connect(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;}XTcp::~XTcp()
{}

XTcp.h

//#pragma once
#ifndef _XTCP_H_
#define _XTPC_H_
#include <string>
class XTcp
{
public:int CreateSocket();bool Bind(unsigned short port);XTcp Accept();   //注意这个返回类型不是指针类型,我们需要在后面重新调用一个closesocket函数void Close();int Recv(char *buf,int bufsize);int Send(const char *buf,int sendsize);bool Connect(const char *ip,unsigned short port);  //注意,暂时不考虑连接超时的情况XTcp();virtual ~XTcp();int sock = 0;unsigned short port = 0;std::string ip;    //这些信息可以对外开放
};#endif //_XTCH_H_

C++socket编程(五):5.1 创建tcpclient项目相关推荐

  1. socket编程五种模型

    客户端:创建套接字,连接服务器,然后不停的发送和接收数据. 比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套 ...

  2. windows socket编程五种模型

    客户端:创建套接字,连接服务器,然后不停的发送和接收数据. 比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套 ...

  3. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  4. Python3进阶--Socket编程、多线程(创建方式、线程通信、线程锁、线程池)

    第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...

  5. Python可以这样学(第五季:Socket编程)-董付国-专题视频课程

    Python可以这样学(第五季:Socket编程)-1585人已学习 课程介绍         董付国老师系列教材<Python程序设计(第2版)>(ISBN:9787302436515) ...

  6. java socket编程心跳_Java Socket编程心跳包创建实例解析

    1.什么是心跳包? 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用 ...

  7. socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字

    前面一小节,我们已经写出了TcpServer的构造函数.这个函数的实际作用,就是创建了listen socket(监听嵌套字).这一节,我们来具体分析这个创建的过程. socket和sockaddr的 ...

  8. 通过Socket编程理解TCP三次握手

    Socket编程--应用层开发 由于传输层以下都是属于操作系统内部的服务(内部的网络管理模块) Socket就是其提供的窗口,如果你想利用系统网络管理中的传输层.网络层.链路层服务你都需要通过Sock ...

  9. Windows下的socket编程

    前言 经过一周的时间,我又回来啦,这周我主要学习的是Windows下的socket网络编程.本篇博客的内容包括socket的简介.TCP/IP协议的讲解.TCP socket编程实例.UDP sock ...

最新文章

  1. css定位页面元素,页面元素定位-CSS元素基本定位
  2. 洛谷 P1019 单词接龙 Label:dfs
  3. Vim Vundle 插件管理器
  4. python语言入门n-python语言入门之字符串的一些用法
  5. 《实时控制软件设计》第一周作业
  6. PCA、SVD、ZCA白化理论与实现
  7. Java JDBC篇4——数据库连接池
  8. vue element-UI的树形结构,父级关联,返回数据反选的问题
  9. 将linux用在开发环境中
  10. oracle的db的容量计算公式,Oracle如何精确计算row的大小
  11. 小程序直播 OBS 画质_教你玩转微信小程序直播
  12. 1.1 统计学习方法概论(个人笔记与随感)
  13. 什么是AOP(通俗易懂)
  14. 详解AVL树(平衡二叉树)
  15. linux asm 裸设备,为ASM生成裸设备
  16. 示波器X-Y模式显示利萨如(李沙育)与DIY图像
  17. GitChat·Python | 零基础小白如何入门 Python 编程
  18. NAND Flash硬件原理
  19. 在外远程登录公司内网OA系统
  20. 面向医疗数据的差分隐私保护

热门文章

  1. pySpark加载数据
  2. javascript的数据检测总结
  3. Hibernate面试题收藏
  4. 由遍历集合所联想到的一些问题
  5. IModelBinder
  6. linux安装软件w,Linux软件安装小结
  7. android评论功能带emoji,分享一个自己写的emoji-comments评论组件
  8. 1000道Python题库系列分享一(17道)
  9. js小数运算出现多为小数问题_js小数计算小数点后显示多位小数的实现方法
  10. cpu线程_CPU核数和线程数有什么用?什么意思?CPU核数和线程的关系与区别