简单控制台聊天例子

来源:互联网 发布:一个网络机房多少钱 编辑:程序博客网 时间:2024/04/29 20:28

服务端程序

#include <iostream>

#include <WinSock2.h>
#pragma comment( lib, "ws2_32.lib")
using namespace std;

DWORD __stdcall _send(LPVOID lpram)
{
    SOCKET client = (SOCKET)lpram;
    char sendBuf[255];
    int flag = 0;
    while (1)
    {
        gets(sendBuf);
        flag = send(client,sendBuf,strlen(sendBuf)+1,0);
        if (flag <=0)
        {
            break;
        }
    }
    closesocket(client);
    return 0;
}

DWORD __stdcall _resv(LPVOID lpram)
{
    SOCKET client = (SOCKET)lpram;
    char recvBuf[255];
    int flag= 0;
    while (1)
    {
        flag = recv(client,recvBuf,255,0);
        if (flag <=0)
        {
            break;
        }
        printf("%s\n",recvBuf);
    }
    closesocket(client);
    return 0;
}
int main()
{
    WSADATA data;
    WORD versionRequested;
    int err;
    versionRequested = MAKEWORD(1,1);

    err = WSAStartup(versionRequested,&data);

    if (err !=0)
    {
        return -1;
    }
    if (!((data.wVersion ^ (data.wVersion>>8<<8) &1) && (data.wVersion>>8&1)))
    {
        WSACleanup();
        return -1;
    }

    SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
    if (sockSrv == INVALID_SOCKET)
    {
        WSACleanup();
        return -2;
    }
    //linux  fcntl();
    //ioctlsocket();

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(26800);
    
    
    if (bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
        closesocket(sockSrv);
        WSACleanup();
        return -3;
    }


    if (listen(sockSrv,10) == SOCKET_ERROR)
    {
        closesocket(sockSrv);
        WSACleanup();
        return -4;
    }

    SOCKADDR_IN addrClient;
    int len = sizeof(SOCKADDR);

    SOCKET sockClient = SOCKET_ERROR;
    while (1)
    {
        while (sockClient == SOCKET_ERROR)
        {
            //accept(sockSrv,(SOCKADDR *)&addrClient,&len);
            sockClient = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
        }
        printf("%s连接成功\n",inet_ntoa(addrClient.sin_addr));
        DWORD m_ThreadId;
        HANDLE m_ThreadSend = CreateThread(NULL,0,_send,(LPVOID)sockClient,0,&m_ThreadId);
        HANDLE m_ThreadResv = CreateThread(NULL,0,_resv,(LPVOID)sockClient,0,&m_ThreadId);
        sockClient = SOCKET_ERROR;
        //WaitForSingleObject(m_ThreadSend, INFINITE);
        //WaitForSingleObject(m_ThreadResv, INFINITE);    
    }
    WSACleanup();
    return 0;

}




客户端程序


#include <iostream>
#include <WinSock2.h>
#pragma comment( lib, "ws2_32.lib")
using namespace std;

DWORD __stdcall _send(LPVOID lpram)
{
    SOCKET client = (SOCKET)lpram;
    char sendBuf[255];
    int flag = 0;
    while (1)
    {
        gets(sendBuf);
        flag = send(client,sendBuf,strlen(sendBuf)+1,0);
        if (flag <=0)
        {
            printf("%d\n",WSAGetLastError());
            break;
        }
    }
    closesocket(client);
    return 0;
}

DWORD __stdcall _resv(LPVOID lpram)
{
    SOCKET client = (SOCKET)lpram;
    char recvBuf[255];
    int flag= 0;
    while (1)
    {
        flag = recv(client,recvBuf,255,0);
        if (flag <=0)
        {
            break;
        }
        printf("%s\n",recvBuf);
    }
    closesocket(client);
    return 0;
}

int main()
{
    WSADATA data;
    WORD versionRequsted;
    versionRequsted = MAKEWORD(2,2);

    int err = WSAStartup(versionRequsted,&data);
    if (err !=0)
    {
        return -1;
    }

    if (!((data.wVersion ^ (data.wVersion>>8<<8) &2) && (data.wVersion>>8&2)))
    {
        WSACleanup();
        return -1;
    }

    {
        SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
        SOCKADDR_IN addrSrv;
        addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(26800);
        printf("%d\n",connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)));
        DWORD m_ThreadId;
        
        HANDLE m_ThreadSend = CreateThread(NULL,0,_send,(LPVOID)sockClient,0,&m_ThreadId);
        HANDLE m_ThreadResv = CreateThread(NULL,0,_resv,(LPVOID)sockClient,0,&m_ThreadId);

        WaitForSingleObject(m_ThreadSend, INFINITE);
        WaitForSingleObject(m_ThreadResv, INFINITE);
    }
    WSACleanup();
    return 0;
}


0 0
原创粉丝点击