【C++】网络编程初试——一个网络聊天室

服务端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define NUM 1024
int ct;
SOCKET clientSocket[NUM];
void tongxin(int index);
int main() {
    ct = 0;
    cout << "服务端" << endl;
    //1)确定网络协议版本
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
        cout << "确定网络协议版本失败:" << GetLastError() << endl;
        return -1;
    }
    cout << "确定网络协议版本成功!" << endl;
    //2)创建Socket
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == SOCKET_ERROR) {
        cout << "创建socket失败:" << GetLastError() << endl;
        //9)清理协议版本信息
        WSACleanup();
        return -1;
    }
    cout << "创建socket成功!" << endl;
    //3)确定服务器协议地址簇
    SOCKADDR_IN addr = { 0 };
    addr.sin_family = AF_INET;
    //设置IP地址啦!
    addr.sin_addr.S_un.S_addr = inet_addr("10.0.0.200");
    addr.sin_port = htons(9200);
    //4)绑定
    int r = bind(serverSocket, (sockaddr*)&addr, sizeof(addr));
    if (r == -1) {
        cout << "绑定失败:" << GetLastError() << endl;
        //8)关闭socket
        closesocket(serverSocket);
        //9)清理协议版本信息
        WSACleanup();
        return -1;
    }
    cout << "绑定成功" << endl;
    //5)监听
    r = listen(serverSocket, 10);
    if (r == -1) {
        cout << "监听失败:" << GetLastError() << endl;
        //8)关闭socket
        closesocket(serverSocket);
        //9)清理协议版本信息
        WSACleanup();
        return -1;
    }
    cout << "监听成功" << endl;
    //6)接受客户端连接
    for (int i = 0; i < NUM; i++) {
        clientSocket[i] = accept(serverSocket, (sockaddr*)NULL, NULL);
        if (r == -1) {
            cout << "服务器崩溃:" << GetLastError() << endl;
            //8)关闭socket
            closesocket(serverSocket);
            //9)清理协议版本信息
            WSACleanup();
            return -1;
        }
        cout << "有客户端" << i << "连接服务器啦!" << endl;
        ct++;
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)tongxin, (LPVOID)i, NULL, NULL);
    }
    //8)关闭socket
    closesocket(serverSocket);
    //9)清理协议版本信息
    WSACleanup();
    return 0;
}
void tongxin(int index) {
    //7)通信
    //如何解决并发执行的问题?等待客户端连接的同时,也要能通信。
    //异步IO,IO多路复用,多线程
    int r;
    char buff[56];
    char temp[80];
    while (1) {
        Sleep(500);
        r = recv(clientSocket[index], buff, 55, NULL);
        if (r > 0) {
            buff[r] = '\0';
            cout << "客户端[" << index << "]说:" << buff << endl;
            memset(temp, 0, 80);
            sprintf(temp, "客户端%d说:%s", index, buff);
            //同时发送给所有连上服务器的客户端
            for (int i = 0; i < ct; i++) {
                send(clientSocket[i], temp, strlen(temp), NULL);
            }
        }
    }
}

客户端

#define _WINSOCK_DEPRECATED_NO_WARNINGS 
#include <iostream>
#include <string>
#include <sstream>
#include <WinSock2.h>
#include <graphics.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
SOCKET serverSocket;
void mySend() {
    //7)通信
    char buff[56];
    //循环发送数据
    while (1) {
        cin.getline(buff, sizeof(buff));
        send(serverSocket, buff, strlen(buff), NULL);
    }
}
int main() {
    cout << "客户端" << endl;
    initgraph(500, 500, SHOWCONSOLE);
    int len = 0;//显示当前位置
    //1)确定网络协议版本
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
        cout << "确定网络协议版本失败:" << GetLastError() << endl;
        return -1;
    }
    cout << "确定网络协议版本成功!" << endl;
    //2)创建Socket
    serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == SOCKET_ERROR) {
        cout << "创建socket失败:" << GetLastError() << endl;
        //9)清理协议版本信息
        WSACleanup();
        return -1;
    }
    cout << "创建socket成功!" << endl;
    //3)确定服务器协议地址簇
    SOCKADDR_IN addr = { 0 };
    addr.sin_family = AF_INET;
    //设置IP地址啦!
    addr.sin_addr.S_un.S_addr = inet_addr("123.182.43.129");
    addr.sin_port = htons(9200);
    //4)连接
    int r = connect(serverSocket, (sockaddr*)&addr, sizeof(addr));
    if (r == -1) {
        cout << "服务器连接失败:" << GetLastError() << endl;
        //8)关闭socket
        closesocket(serverSocket);
        //9)清理协议版本信息
        WSACleanup();
        return -1;
    }
    cout << "服务器连接成功!" << endl;
    //7)通信
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mySend, NULL, NULL, NULL);
    char temp[60];
    while (1) {
        //接受服务器发来的数据并显示
        r = recv(serverSocket, temp, 59, NULL);
        if (len % 25 == 0) {
            cleardevice();
            len = 0;
        }
        if (r > 0) {
            temp[r] = '\0';
            outtextxy(1, len * 20, temp);
            len++;
        }
    }
    //8)关闭socket
    closesocket(serverSocket);
    //9)清理协议版本信息
    WSACleanup();
    return 0;
}
img

网络编程九大步骤

【服务端】1)确定网络协议版本,2)创建Socket,3)确定服务器协议地址簇,4)绑定,5)监听,6)接受客户端连接,7)通信,8)关闭socket,9)清理协议版本信息

【客户端】1)确定网络协议版本,2)创建Socket,3)确定服务器协议地址簇,4)连接服务器,5)通信,6)关闭socket,7)清理协议版本信息

© 版权声明
THE END
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容