C++多线程socket系统新编

server-socket

#include "stdafx.h"
#include "winsock2.h"
#include <iostream>
#include <string>
#include <cassert>
#include <thread>
#include <mutex>
#include <vector>
#include <algorithm>
#pragma comment(lib,"ws2_32.lib")

std::vector<SOCKET> allsock;
std::mutex mt;
void sendtoall(std::string msg) {
    mt.lock();
    for (auto e = allsock.begin(); e != allsock.end();++e)
    {
        send(*e, msg.c_str(), msg.size() + 1, 0);
    }
    mt.unlock();
}
void t_send_recv(SOCKET acc_sock, struct sockaddr_in acc_addr) {
    std::string msg;
    std::string info = inet_ntoa(acc_addr.sin_addr);
    auto port = acc_addr.sin_port;
    char ch[1024];
    memset(ch,0,1024);
    sprintf(ch,":%d",port);
    info += ch;
    msg = info + ":已登录";
    sendtoall(msg);
    char recvBuffer[1024];
    memset(recvBuffer, 0, sizeof(recvBuffer));
    int byte;
    while ((byte = recv(acc_sock, recvBuffer, sizeof(recvBuffer), 0)) > 0) {
        std::cout << info << "说:" << recvBuffer << std::endl;
        msg = info + "说:\r\n\t" + recvBuffer;
        sendtoall(msg);
        memset(recvBuffer, 0, sizeof(recvBuffer));
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}
void t_accept(SOCKET lis_sock) {
    SOCKET acc_sock;
    struct sockaddr_in acc_addr;
    int len = sizeof(acc_addr);
    while (1)
    {
        acc_sock = accept(lis_sock, (struct sockaddr*)&acc_addr, &len);
        if (acc_sock == INVALID_SOCKET)
        {
            std::cout << "有一个连接未成功" << std::endl;
            continue;
        }
        auto port = acc_addr.sin_port;
        char ch[1024];
        memset(ch, 0, 1024);
        sprintf(ch, ":%d", port);
        
        std::cout << inet_ntoa(acc_addr.sin_addr) << ch  << ":连接成功" << std::endl;
        mt.lock();
        allsock.push_back(acc_sock);
        mt.unlock();
        std::thread t_sr(t_send_recv, acc_sock, acc_addr);
        t_sr.detach();
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }


}
int main()
{
    // =========套接字部分=========
    WORD wVersionRequested;
    WSADATA wsa;
    int err;
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsa);
    if (err != 0) {
        std::cout << "套接字创建失败" << std::endl;
        exit(-1);
    }
    std::cout << "套接字已创建" << std::endl;

    // =========监听socket=========
    SOCKET lis_sock;
    lis_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    //==========协议地址==========
    struct sockaddr_in lis_addr;
    lis_addr.sin_family = AF_INET;
    lis_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    lis_addr.sin_port = htons(6688);

    //==========绑定监听socket与协议地址=========
    int bind_res = bind(lis_sock, (struct sockaddr*)&lis_addr, sizeof(lis_addr));
    if (bind_res == SOCKET_ERROR) {
        std::cout << "绑定套接字与协议地址失败" << std::endl;
        exit(-1);
    }
    std::cout << "绑定套接字成功" << std::endl;
    //======设置监听的数量=====
    int listen_res = listen(lis_sock, 10);
    if (listen_res == SOCKET_ERROR) {
        std::cout << "监听套接字失败" << std::endl;
        exit(-1);
    }
    std::cout << "监听套接字成功" << std::endl;

    //===========开始处理连接=============
    std::thread accept_thread(t_accept, lis_sock);
    accept_thread.join();

    getchar();
    exit(0);
}
client-socket

#include "stdafx.h"
#include "winsock2.h"
#include <iostream>
#include <string>
#include <cassert>
#include <thread>
#include <mutex>
#pragma comment(lib,"ws2_32.lib")
void sendmsg(SOCKET sock);
void recvmsg(SOCKET sock);
std::mutex mt;
void sendmsg(SOCKET sock) {
	char sendBuffer[1024];
	memset(sendBuffer,0,1024);
	int byte = 0;
	std::cin >> sendBuffer;
	byte = send(sock, sendBuffer, strlen(sendBuffer) + 1, 0);
	recvmsg(sock);
	std::this_thread::sleep_for(std::chrono::milliseconds(1));
	closesocket(sock);
}
void recvmsg(SOCKET sock) {
	char recvBuffer[1024];
	int byte = 0;
	byte = recv(sock, recvBuffer, strlen(recvBuffer) + 1, 0);
	recvBuffer[byte] = 0;
	std::cout << recvBuffer << std::endl;
	sendmsg(sock);
	std::this_thread::sleep_for(std::chrono::milliseconds(1));
	closesocket(sock);
}
int main()
{
	// =========套接字部分=========
	WORD wVersionRequested;
	WSADATA wsa;
	int err;
	wVersionRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersionRequested, &wsa);
	if (err != 0) {
		std::cout << "套接字创建失败" << std::endl;
		exit(-1);
	}
	std::cout << "套接字已创建" << std::endl;

	// ==========客户端socket=======
	SOCKET client_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	
	// ==========客户端协议地址===========
	struct sockaddr_in client_addr;
	client_addr.sin_family = AF_INET;
	client_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	client_addr.sin_port = htons(6688);

	//===========开始处理连接=============
	SOCKET acc_sock;
	acc_sock = connect(client_sock, (struct sockaddr*)&client_addr, sizeof(client_addr));
	if (acc_sock == INVALID_SOCKET)
	{
		std::cout << "没有连接到服务器" << std::endl;
	}
	std::cout << "连接到服务器" << std::endl;
	std::thread b(recvmsg, client_sock);
	b.join();
	std::this_thread::sleep_for(std::chrono::milliseconds(1));

	getchar();
	exit(0);
}


你可能感兴趣的:(C++多线程socket系统新编)