基于TCP连接的C S模式的最简单模型代码

socket编程 -- 基于TCP协议的C/S通信模型及实现 基于TCP协议的客户端/服务器的程序下图是基于TCP协议的客户端/服务器程序的一般流程服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到 阅读详情

Windows Socket(基于TCP连接的)编程的程序代码简单结构.

 

服务端:

   1. 初始化Windows Socket.

   2. 创建Socket. (socket)

   3. 绑定Socket. (bind: socket绑定本机的一个IP地址和端口)

   4. 监听.(listen: 设置监听同时设置监听数量)

   5. Accept. (accept: 服务端每接收到一个客户端的Socket,则创建一个线程,  满足一个服务端连接多个客户端.

   6. 接收、发送数据.(有很多模型选择)

 

客户端

   1. 初始化Windows Socket.

   2、创建Socket.(socket)

   3、连接Socket.(connect: 连接服务端的IP地址和端口)

   4、接收、发送数据.(有很多模型选择)

 

这是一个最简答的模型了就是ServerClient建立通信并可以收发数据的最简单模型.


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Server
// Server.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")

DWORD WINAPI ClientThread(LPVOID lpParameter)
{
    SOCKET clientSocket = (SOCKET)lpParameter;
    int nRet = 0;
    char chRecvBuffer[MAX_PATH];

    while(true)
    {
        memset(chRecvBuffer, 0x00, sizeof(chRecvBuffer));
        nRet = recv(clientSocket, chRecvBuffer, MAX_PATH, 0);
        if(0 == nRet || SOCKET_ERROR == nRet) 
        {
            std::cout << "客户端退出!" << std::endl;
            break;
        }
        std::cout<< "接收到客户信息为:" << chRecvBuffer << std::endl;
    }

    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA  wsAData;
    SOCKET serverSocket, clientSocket;
    struct sockaddr_in localAddr, clientAddr;
    int nRet = 0;
    int nAddrLen = 0;
    HANDLE hThread = NULL;

    // 初始化Win Socket
    if(0 != WSAStartup(MAKEWORD(2,2), &wsAData))
    {
        std::cout << "Init Windows Socket Failed. "<< GetLastError() << std::endl;
        return -1;
    }
    
    // 创建Socket
    serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(INVALID_SOCKET == serverSocket)
    {
        std::cout << "Create Socket Failed:" << GetLastError() << std::endl;
        return -1;
    }

    memset(&localAddr, 0x00, sizeof(localAddr));
    localAddr.sin_family = AF_INET;
    localAddr.sin_addr.s_addr = htonl(INADDR_ANY);;		// 这你也可以显式的指定你的本地的IP地址(例如你的电脑有多个IP地址)
    // localAddr.sin_addr.s_addr = inet_addr("172.20.3.30");
    localAddr.sin_port = htons(6123);

    // 绑定地址和端口
    nRet = bind(serverSocket, (struct sockaddr*)&localAddr, sizeof(localAddr));
    if(0 != nRet)
    {
        std::cout << "Bind Socket Failed:" << GetLastError() << std::endl;
        return -1;
    }

	// 设置监听
    nRet = listen(serverSocket, 10);
    if(0 != nRet)
    {
        std::cout << "listen Socket Failed::" << GetLastError() << std::endl;
        return -1;
    }

    std::cout << "Server Begin Accept." << std::endl;

    while(true)
    {
        nAddrLen = sizeof(clientAddr);
		// accept
        clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &nAddrLen);
        if(INVALID_SOCKET == clientSocket)
        {
            std::cout << "Accept Failed:" << GetLastError() << std::endl;
            break;
        }
		
        std::cout << "New Client:" << inet_ntoa(clientAddr.sin_addr) << ":" << clientAddr.sin_port << std::endl;
        
        hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)clientSocket, 0, NULL);
        if(NULL == hThread)
        {
            std::cout << "Create Thread Failed!" << std::endl;
            break;
        }
    }

	// 这里要销毁你的所有client的资源
	// closesocket(clientSocket);
    closesocket(serverSocket);    

    WSACleanup();
    return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// Client
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Client.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA  wsAData;
    SOCKET clientSocket;
    struct sockaddr_in serverAddr;
    int nRet = 0;
    char chSendBuffer[MAX_PATH];

    // 初始化Win Sock
    if(0 != WSAStartup(MAKEWORD(2,2), &wsAData))
    {
        std::cout << "Init Windows Socket Failed::" << GetLastError() << std::endl;
        return -1;
    }

    // 创建Socket
    clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(INVALID_SOCKET == clientSocket)
    {
        std::cout <<"Create Socket Failed:"<< GetLastError() << std::endl;
        return -1;
    }

	memset(&serverAddr, 0x00, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("172.20.3.30");
    serverAddr.sin_port = htons(6123);

	// 连接服务器
    nRet = connect(clientSocket,(struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if(SOCKET_ERROR ==  nRet)
    {
        std::cout << "Connect Error:" << GetLastError() << std::endl;
        return -1;
    }
    else
    {
        std::cout << "Connect Successful." << std::endl;
    }

    while ( true )
    {
        std::cin.getline(chSendBuffer, sizeof(chSendBuffer));
        nRet = send(clientSocket, chSendBuffer, (int)strlen(chSendBuffer), 0);
        if(SOCKET_ERROR  == nRet)
        {
            std::cout << "Send Data Error:" << GetLastError() << std::endl;
            break;
        }
    }
    
    closesocket(clientSocket);
    WSACleanup();

    return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


转自: http://www.cppblog.com/bujiwu/archive/2009/01/11/71707.aspx


简单的Java C/S模式 <br />简单的Java C/S模式<br />(TCP协议下C/S模式)<br />TCP通信原理流程<br />客户端:<br />a、用服务器的IP地址和端口号实例化Socket对象;<br />b、调用connect方法,连接到服务器上;<br />c、将发送到服务器的I/O流填充到I/O对象里,比如BufferedReader/PrintWriter;<br />d、利用Socket提供的getInputStream和getOutputStream方法,通过I/O流对象,向服务器发送数据流;<b 阅读详情

相关推荐

python Socket网络编程实现C/S模式、P2P

python Socket网络编程实现C/S模式、P2PC/S模式TCP/IP协议服务端:客户端:UDP协议服务端客户端C/S模式的应用程序服务端客户端P2P模式注意总结 C/S模式 由于网络课需要实现Socket网络编程,所以简单实现了一下,C/S模式分别用TCP/IP协议与UDP协议实现,下面将分别讲解。 TCP/IP协议 TCP/IP协议是面向连接的,即客户端与服务器需要先建立连接后才能传输数据,以下是服务器端的代码实现。 服务端: import socket from threading impor

asfsfsdc的博客 3023

利用socket开发基于TCP的c/s通信程序

利用socket开发基于TCP的的C/S通信程序,一个是服务器,一个是客户,服务器和客户间可以进行通信

C/S通信模型与B/S通信模型介绍

1、客户端与服务器之间的通信模型

Alisa11的专栏 1万+

基于qt编写的c/s模型的简单聊天程序

本文讲解了用qt在linux中实现基于qt编写的c/s模型的简单聊天程序,包括源代码

MODBUS TCP C 源码 -- 测试过汇川PLC

MODBUS TCP C# 源码 -- 测试过汇川PLC 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了一个基于TCP的Modbus协议的C#源码,该源码已经过测试,可以与汇川PLC进行通信。Modbus是一种常用的工业通信协议,最初是基于串口通信的,但随着TCP/IP的发展,出现了基于TCP的Modbus协议。 功能描述 该源码实现了以下功能: 读取多个...

gitblog_09710的博客 605

基于tcp的c/s模型的一个简单的socket实现

基于tcp的c/s模型的一个简单的socket实现

zxcvbnm0014的专栏 4634

网络协议 | 典型协议、B/S模式、C/S模式

介绍了网络协议的概念,Linux网络中常见的几种典型协议,网络应用程序的设计模式——B/S和C/S模式

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 4158

C++网络编程之C/S模型

网络编程中,客户端/服务器模型(即C/S模型)是一种常见的架构模式。在这种模式下,一个或多个客户端向服务器建立连接,并发送请求;服务器接受这些连接,并处理请求、返回响应。在C/S模型中,客户端会主动发起与服务器的连接,发送请求,并接收服务器的响应。客户端可以是任何能够发起网络连接的设备或应用程序。服务器通常运行在网络中的固定位置,监听特定端口以接受来自客户端的连接请求。

hope_wisdom的技术博客 2026

【C++】C/S模型TCP客户端应用

在C/S模型中,一个或多个客户端向服务器建立连接,并发送请求;服务器接受这些连接,处理请求,并返回响应。客户端:主动发起与服务器的连接,发送请求,并接收服务器的响应。客户端可以是任何能够发起网络连接的设备或应用程序。服务器:通常运行在网络中的固定位置,监听特定端口以接受来自客户端的连接请求。服务器负责处理这些请求,并返回相应的响应。*C/S模型的优势在于其灵活性和可扩展性。*客户端和服务器可以独立开发和部署,便于维护和升级。此外,这种模式还支持多种通信协议,如TCP、UDP等,满足了不同应用场景的需求。

richard_yuu的博客 1220

基于TCP的C/S通信仿真

模拟实现TCP协议通信过程,要求编程实现服务器端与客户端之间双向数据传递。客户端向服务器端发送“我是集美大学网络工程专业学生”,服务器回应“我也是集美大学网络工程专业学生”。 【提示:服务器端创建监听套接字,并为它关联一个本地地址(指定IP地址和端口号),然后进入监听状态准备接受客户的连接请求。为了接受客户端的连接请求,服务器端必须调用accept函数。客户端创建套接字后即可调用connect函数去试图连接服务器监听套接字。当服务器端的accept函数返回后,connect函数也返回。此时客户端使用socket函数创建的套接字,服务器端使用accept函数创建的套接字,双方实现通信。】

基于Tcp协议的c/s模式简单通信(c#)

基于Tcp协议的c/s模式简单通信(c#),服务器向客户端发消息用广播模式

基于C/S模式的简单聊天程序(附程序源码)

基于C/S模式的简单聊天程序(附程序源码) 一、需求分析 设计要求 ​ 使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。聊天时可以启动多个客户端。服务器端启动后,接收客户端发来的用户名和密码验证信息。验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系...

dglx_的博客 7722

基于TCP的C/S程序设计报告

1 课题描述 在 Windows操作系统下,使用Socket 编程实现两个进程之间的通信,两个进程间使用TCP 建立可靠连接, 熟悉 TCP 协议以及套接字编程原理;两个进程间使用C/S 工作模式,在此结合并发服务器原理,实现服务器同时与多进程之间进行通信,深入了解 C/S 工作模式TCP 是传输层的应用协议,可通过多方而来保证数据传输的可靠性, 它采用了停止等待方式来回应数据的接收,只有当接收到数据时,用户才发送数据确认报文,同时此协议使用滑动窗口方法来控制网络拥塞,提高数据传输的可靠性。 基于TCP

qq_48976048的博客 2749

基于TCP协议的C/S端程序的基本流程

基于TCP协议的C/S端程序的基本流程服务端通讯流程TCP服务端基本通讯示例客户端通讯流程TCP客户端基本通讯示例总结:图解简单的TCP通讯过程总结:通讯过程中用到的函数参数及返回值socket()函数字节序转换函数listen()函数accept()和connect()函数send()和recv()函数注意事项 服务端通讯流程 服务端: 1、通过socket()函数创建用于接收连接请求的socket 2、构造主机连接地址的sockaddr_in结构体,包括sin_family,sin_port,sin

qq_34269632的博客 3287

C/S模型与P2P模型

C/S模型的逻辑很简单。服务器启动后,首先创建一个(或多个)监听socket, 并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接。 P2P (Peer to Peer,点对点)模型比C/S模型更符合网络通信的实际情况。它摒弃了以服务器为中心的格局,让网络上所有主机重新回归对等的地位。...

商务合作|种草文章|产品测评 2546

通过TCP协议进行C/S模式网络通信

通过TCP协议进行C/S模式网络通信 server.c 1.sockaddr_in 结构体 struct sockaddr_in{ sa_family_t sin_family; //地址族(Address Family),也就是地址类型 uint16_t sin_port; //16位的端口号 str...

lidandan999的博客 1467

TCP连接分析TUXEDO的WS模式

Abstract: 关于中间件,有一个很有名的定义是:平台+通信。这一点在TUXEDO上面得到了很好的体现,因为它提供了运行和开发的平台,以及多种的通信方式。在这多种通信方式中,使用最频繁的是WS(workstation)方式。WS方式使用的是TCP连接,为了对WS方式有更多的了解,我们结合TCP连接的知识对这种方式进行了一个比较深入的分析。名词说明: WSC: WorkStation C

qiup的书斋 2940

网络编程一(C/S-TCP模型

协议 1> 预备知识 1>网络数据流采用大端字节序(高对高);(补充:x86系统采用小端字节序(低对低)) 因此,在socket编程时需要将主机字节序转换为网络字节序(如果主机采用大端模式,则不需要转换)(路由传输(大端),链路层\网络层) /******************************************************** *函数4:htonl()\htons()\ntohl()\ntohs *头文件:#include <arpa/inet.h> *格式.

KHY666的博客 517
上一篇: 通过域名获得IP
下一篇: C++ 对象池
小大小丑
博客等级 码龄18年 483粉丝 425原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值