基于TCP的CS模型建立

初始化动态库

SocketInit socketInit;

服务端

  1. 创建监听套接字

SOCKET sListen=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

    if (sListen == SOCKET_ERROR)
    {
        printf("监听套接字创建失败\n");
        return -1;
    }
  1. 绑定套接字

sockaddr_in sock_in;
    sock_in.sin_family = AF_INET;
    sock_in.sin_port = htons(12306);
    sock_in.sin_addr.S_un.S_addr = INADDR_ANY;//INADDR_ANY(获取本机地址)
    //绑定套接字
    int ret=bind(sListen, (const sockaddr*)&sock_in, sizeof(sock_in));
    //判断绑定套接字是否成功
    if (ret == SOCKET_ERROR)
    {
        printf("绑定套接字失败\n");
        closesocket(sListen);
    }
    else printf("绑定套接字成功\n");
  1. 监听

    if (listen(sListen, 10) == SOCKET_ERROR)
    {
        printf("监听失败\n");
        closesocket(sListen);
        return -1;
    }
    else printf("监听成功\n");
  1. 接收客户端的连接

sockaddr_in clientAddr;
    int nlen = sizeof(sockaddr_in);
    
    SOCKET sClient=accept(sListen, (sockaddr*)&clientAddr, &nlen);
    if (sClient == SOCKET_ERROR)
    {
        printf("接收失败\n");
        closesocket(sListen);
        return -1;
    }
    printf("与客户端建立连接...\n");
  1. 接收数据

while (1) {
        char buff[1024];
        memset(buff, 0, sizeof(buff));//清空数组
        int ret = recv(sClient, buff, 1024, 0);
        if (ret > 0)
        {
            //printf("接收到的数据:%s\n", buff);
            cout << "客户端:" << buff << endl;
        }
        else {
            printf("客户端断开连接\n");
            break;
        }

        memset(buff, 0, sizeof(buff));//清空数组
        cout << "<";
        cin.getline(buff, sizeof(buff));
        //gets_s(buff, 1024);//输入要发送的内容
        ret = send(sClient, buff, strlen(buff), 0);//发送数据
        if (ret == -1) {
            cout << "发送信息失败";
            WSACleanup();
            return -1;
        }
    }
  1. 回收资源

closesocket(sListen);

客户端

  1. 创建客户端套接字

SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sClient == SOCKET_ERROR)
    {
        printf("客户端套接字创建失败\n");
        return -1;
    }
    else printf("客户端套接字创建成功\n");
    sockaddr_in sock_in;
    sock_in.sin_family = AF_INET;
    sock_in.sin_port = htons(12306);
    sock_in.sin_addr.S_un.S_addr =inet_addr("169.254.250.0");//以本机地址做服务器地址
  1. 连接服务器

if (connect(sClient, (const sockaddr*)&sock_in, sizeof(sockaddr_in)) == SOCKET_ERROR) {
        printf("服务器连接失败\n");
        return -1;
    }
    else printf("连接服务器成功\n");
  1. 收发数据

while(1) {
        //客户端发送消息
        char buff[1024];
        memset(buff, 0, sizeof(buff));
        printf(">");
        cin.getline(buff, sizeof(buff));//输入要发送的内容
        send(sClient, buff, strlen(buff), 0);//发送数据
        //客户端接收消息
        memset(buff, 0, sizeof(buff));//清空数组
        int ret = recv(sClient, buff, 1024, 0);
        if (ret > 0)
        {
            cout << "服务端:" << buff << endl;
        }
        else {
            printf("服务端断开连接\n");
            break;
        }

    }
  1. 回收资源

closesocket(sClient);

动态库

#ifndef _SOCKET_INIT_H
#define _SOCKET_INIT_H
#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib")
class SocketInit {
public:
    SocketInit() {
        WORD sockVersion = MAKEWORD(2, 2);
        WSADATA wasData;
        if (WSAStartup(sockVersion, &wasData) != 0) {
            printf("动态库加载失败!\n");
        }
        else printf("动态库加载成功!\n");
        
    }
    ~SocketInit() {
        WSACleanup();
    }

};

#endif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TCP协议是目前应用最广泛的一种协议,它可靠、稳定、保持数据传输的顺序,并在网络出现拥塞情况时进行流量控制。因此,在火车售票程序的设计中,应该采用基于TCP协议的客户端-服务器(CS)架构,以确保程序的高效、稳定和可靠性。 首先,服务器端需要创建一个监听套接字,用来监听客户端的连接请求,并开启一个线程来处理客户端的请求。在客户端请求连接之后,服务器接受连接请求并分配一个线程来处理该客户端的请求,同时可以在服务器端建立一个共享的数据结构来记录火车票的信息,包括车次、座位数、起始站和终点站等等。 当客户端需要查询火车票信息时,它向服务器发送请求,服务器接受请求并查询共享的数据结构,返回符合条件的火车票信息给客户端。当客户端需要预订火车票时,它向服务器发送请求,服务器接受请求,查询共享的数据结构,如果票数充足,则将票数减1并将预订成功的信息返回给客户端,否则返回预订失败信息。 在整个过程中,服务器端和客户端之间采用 TCP 通信,确保数据的可靠传输。同时,还需要对火车票的信息进行加锁,保证在多个客户端同时访问时,数据的一致性和安全性。 最终,需要注意的是,火车售票程序需要考虑多种异常情况的处理,如网络连接中断、客户端异常退出、服务器出现宕机等等,针对不同异常情况,需要采取不同的策略,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值