在windows环境下用C++完成一个hello/hi网络聊天程序

经过网络程序设计课程的学习,我们了解了socket网络程序编程,接下来,就要学以致用,完成一个hello/hi的网络聊天程序。

  • Socket介绍 

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。

Socket起源于Unix,而Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式 来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。

你想给另一台计算机发消息,你知道他的IP地址,他的机器上同时运行着qq、迅雷、word、浏览器等程序,你想给他的qq发消息,那想一下,你现在只能通过ip找到他的机器,但如果让这台机器知道把消息发给qq程序呢?答案就是通过port,一个机器上可以有0-65535个端口,你的程序想从网络上收发数据,就必须绑定一个端口,这样,远程发到这个端口上的数据,就全会转给这个程序啦。

  • Socket通信套路

当通过socket建立起2台机器的连接后,本质上socket只干2件事,一是收数据,一是发数据,没数据时就等着。Socket 建立连接的过程跟我们现实中打电话比较像,打电话必须是打电话方和接电话方共同完成的事情,我们分别看看他们是怎么建立起通话的。

接电话方(Socket服务器端):

打电话方(Socket客户端):

  • Socket套接字函数

服务端套接字函数

    S.bind():绑定主机,端口号到套接字。

S.listen():开始tcp监听。

S.accept():等待客户端连接到来。

客户端套接字函数

    S.connect():主动初始化TCP服务连接。

  • 一个简单的hello/hi网络聊天程序

服务器端代码如下:

#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX 999
using namespace std;
int main()
{
    char send_buf[MAX], recv_buf[MAX];
    SOCKET ser_listen, ser_accept;
    SOCKADDR_IN listen_ADDR, accept_ADDR;
    WSADATA wsa;
    //绑定socket库版本
    if (WSAStartup(MAKEWORD(2,2),&wsa)<0)
      {
        cout << "绑定socket库版本失败" << endl;
        exit(EXIT_FAILURE);
       }
    //初始化协议族
    listen_ADDR.sin_family = AF_INET;
    listen_ADDR.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    listen_ADDR.sin_port = htons(5214);
    ser_listen = socket(AF_INET, SOCK_STREAM, 0);
    //绑定主机,端口
    if (bind(ser_listen, (SOCKADDR*)& listen_ADDR, sizeof(SOCKADDR))<0)
    {
        cout << "socket绑定失败!" << endl;
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    //等待连接,此时ser_listen变为被动套接口
    if (listen(ser_listen, SOMAXCONN) < 0)
    {
        cout << "设置监听失败!" << endl;
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    cout << "等待客户端连接!" << endl;
    //len必须提前初始化,不然accept错误
    int len = sizeof(SOCKADDR);
    //此时ser_accept为主动套接口
    if ((ser_accept = accept(ser_listen, (SOCKADDR*)& accept_ADDR, &len))<0)
    {
        cout << "连接失败!" << endl;
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    cout << "连接建立,请在客户端输入!" << endl;
    //消息的传递
    while (1)
    {
        recv(ser_accept, recv_buf, MAX, 0);
        cout << "收到:" << recv_buf << endl << "请输入要发送的信息:" << endl;
        cin >> send_buf;
        send(ser_accept, send_buf, MAX, 0);
    }
    //结束关闭套接口
    closesocket(ser_listen);
    closesocket(ser_accept);
    WSACleanup();
}

客户端代码:

#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX 999
using namespace std;
int main()
{
    char send_buf[MAX], recv_buf[MAX];
    SOCKET cli_accept;
    SOCKADDR_IN cli_ADDR;
    WSADATA wsa;
    //绑定套接字库版本
    if (WSAStartup(MAKEWORD(2, 2), &wsa) < 0)
    {
        cout << "绑定socket库版本失败" << endl;
        exit(EXIT_FAILURE);
    }
    //初始化协议族
    cli_ADDR.sin_family = AF_INET;
    cli_ADDR.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    cli_ADDR.sin_port = htons(5214);
    cli_accept = socket(AF_INET, SOCK_STREAM, 0);
    //连接到服务端套接口
    if (connect(cli_accept, (SOCKADDR*)& cli_ADDR, sizeof(SOCKADDR)) < 0)
    {
        cout << "服务端连接失败!" << endl;
        WSACleanup();
        exit(EXIT_FAILURE);
    }
    else
    {
        cout << "服务端连接成功!" << endl;
    }
    //消息传递
    while (1)
    {
        cout << "请输入发送信息:" << endl;
        cin >> send_buf;
        send(cli_accept, send_buf, MAX, 0);
        recv(cli_accept, recv_buf, MAX, 0);
        cout << "收到:" << recv_buf << endl;
    }
    //关闭套接口
    closesocket(cli_accept);
    WSACleanup();
}

先运行server.exe,再运行client.exe,得到如下运行结果:

  

原文地址:https://www.cnblogs.com/rings/p/12014187.html

时间: 2024-11-06 10:49:12

在windows环境下用C++完成一个hello/hi网络聊天程序的相关文章

python实现一个简单的网络聊天程序

一.Linux Socket 1.Linux Socke基本上就是BSD Socket(伯克利套接字) 伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信.BSD Socket的应用编程接口已经是网络套接字的抽象标准.大多数其他程序语言使用一种相似的编程接口.由于伯克利套接字是第一个socket,大多数程序员很熟悉它们,所以大量系统把伯克利套接字作为其主要的网络API. 主要的头文件如下,不同的系统可能具体不同. <sys/socket.h> BSD

Java实现一个简单的网络聊天程序

一.TCP通信概述 TCP协议是面向连接的通信协议,在传输数据之前,发送端和接收端必须建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输. 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过三次握手. 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠. ·第一次握手,客户端向服务器端发出连接请求,等待服务器确认. ·第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求.

一个简单的网络聊天程序实现

socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口, 这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据

基于Python完成一个hello/hi的简单的网络聊天程序

一.Socket 套接字简介 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. 传输层实现端到端的通信,因此,每一个传输层连接有两个端点.那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口.传输层连接的端点叫做套接字(socket).根据RFC793的定义:端口号拼接到IP

定制windows环境下cmd替代软件ConEmu

定制windows环境下cmd替代软件ConEmu 公认的是Windows环境下命令行界面太难用. 不管是cmd还是powershell都不顺手!!窗口宽度不能全屏,字体太难看还不能调整,窗口背景不能更换,永远的黑白配,最痛苦的是复制和粘贴.都不知道MS是怎么想的?搞个这么个反人类的东西出来,还万年不变,从Windows诞生到Windows7不论是桌面版还是服务器版都一样,到了windows8/windows10换成powershell一样的鸡肋. 在百度搜了一下,找到cmd的替代软件conem

《高可用MySQL》1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容. Master-Slave这东西吧.在很多公司都是标配.开发中基本天天都用.遇到的问题自然也不少(如主从不同步,Master宕机).但操作权限很有限.有些东西,仅仅有自己看了.做了,才干真正知道原理是什么,也才干更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从

python MySQLdb在windows环境下的快速安装、问题解决方式

使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.net/wklken/article/details/7271019 ------------------------------------------------------------- 以下是windows环境下的: 1.      安装数据库mysql 下载地址:http://www.mysql.com/downloa

Windows环境下Android Studio v1.0安装教程

Windows环境下Android Studio v1.0安装教程 Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SDK) (813 MB) exe(不包含SDK) (250 MB) zip (235 MB) Mac dmg (234 MB) zip (233 MB) Linux: zip (233 MB) 说明: 32位系统和64位系统是同一个安

[转]Windows环境下尝试安装并配置PHP PEAR备忘

转自:http://wangye.org/blog/archives/266/ 什么是PEAR 来自百度百科:PEAR 是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写.它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR之于PHP就像是CPAN(Comprehensive Perl Archive Network)之于Perl. 由此可见PEAR是PHP代码的仓库,在这里可以找到很多有用的代码,避免我们重复写一些功能,