c++控制台阻塞+多线程聊天室

来源:互联网 发布:java大牛简历 编辑:程序博客网 时间:2024/06/11 21:36

服务端:

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

using namespace std;

class server
{
public:
    WSADATA wsaData;
    SOCKET sockServer;
    SOCKADDR_IN addrServer;
    SOCKET sockClient;
    SOCKADDR_IN addrClient;

    server();
    void send();
    void recv();

};

server::server()
{
    if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)  
    {  
        cout << "WSAStartup failed!" << endl;  
        return;
    }  

    //创建套接字  
    sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);      
    if(INVALID_SOCKET == sockServer)  
    {  
        cout << "socket failed!" << endl;  
        WSACleanup();//释放套接字资源;  
        return;  
    }  

    //服务器套接字地址  
    addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY表示任何IP
    addrServer.sin_family=AF_INET;
    addrServer.sin_port=htons(5999);//绑定端口6000
    ::bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));

    //Listen监听端
    listen(sockServer,5);//5为等待连接数目
    int len=sizeof(SOCKADDR);
    cout<<"监听中..."<<endl;
    sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len);
    cout<<"已监听到"<<endl;

}

void server::send()
{
     char sendBuf[100];
    for (;;)
    {
        sendBuf[0]='\0';
        cin>>sendBuf;
        if (sendBuf[0]!='\0')
        {
            ::send(sockClient,sendBuf,100,0);
        }    
    }
}

void server::recv()
{
   char recvBuf[100];

    for (;;)
    {
        recvBuf[0]='\0';
        ::recv(sockClient,recvBuf,100,0);
        if (recvBuf[0]!='\0')
        {
            cout<<"客户端:"<<recvBuf<<endl;
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    server sock;

    thread tsend(&server::send,sock);
    thread trecv(&server::recv,sock);
    tsend.join();
    trecv.join();

    system("pause");
    return 0;
}


客户端:

#include "winsock2.h"  
#pragma comment(lib, "ws2_32.lib")  
#include <iostream>
#include <thread>
#include <string>

using namespace std;

class client
{
public:
    WSADATA wsaData;
    SOCKET sockClient;//客户端Socket
    SOCKADDR_IN addrServer;//服务端地址
    client(const string &ip);
    void send();
    void recv();
};

client::client(const string &ip)
{
    WSAStartup(MAKEWORD(2,2),&wsaData);
    //新建客户端socket
    sockClient=socket(AF_INET,SOCK_STREAM,0);
    //定义要连接的服务端地址
    addrServer.sin_addr.S_un.S_addr=inet_addr(ip.c_str());//目标IP(127.0.0.1是回送地址)
    addrServer.sin_family=AF_INET;
    addrServer.sin_port=htons(5999);//连接端口6000
    //连接到服务端
    connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
}

void client::send()
{
    char sendBuf[100];
    for (;;)
    {
        sendBuf[0]='\0';
        cin>>sendBuf;
        if (sendBuf[0]!='\0')
        {
            ::send(sockClient,sendBuf,100,0);
        }    
    }
}

void client::recv()
{
    char recvBuf[100];
    for (;;)
    {
        recvBuf[0]='\0';
        ::recv(sockClient,recvBuf,100,0);
        if (recvBuf[0]!='\0')
        {
            cout<<"服务端:"<<recvBuf<<endl;
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    string ip;
    cout<<"请输入服务端ip:";
    cin>>ip;
    client c(ip);
    thread tsend(&client::send,c);
    thread trecv(&client::recv,c);
    tsend.join();
    trecv.join();
    system("pause");
    return 0;
}


原创粉丝点击