windows socket聊天程序 VC环境 用线程实现 适用初学者

//一对一聊天,用线程实现,一个线程负责发送消息,一个线程负责接收消息

//服务器端

#include <winsock2.h>
#include <windows.h>
#include <iostream.h>   
#define PORT_SERVER 6666
#define NUM_CLIENTS 10
#pragma comment(lib, "ws2_32.lib")

void SendMsg(LPVOID lpParameter);
void RecvMsg(LPVOID lpParameter);

SOCKET sock_client;

int main(int argc, char *argv[])
{
    cout << "Start server..." << endl;

    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 0);
   
    if(WSAStartup(sockVersion, &wsaData) != 0)
    {
        cout << "Failed to retrive version." << endl;
        return 0;
    }
   
    SOCKET sock_sev;
    sock_sev = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

    if(sock_sev == INVALID_SOCKET)
    {
        cout << "Invalid socket." << endl;
        WSACleanup();
        return 0;
    }

    sockaddr_in addr_sev;
    addr_sev.sin_family = AF_INET;
    addr_sev.sin_port = htons(PORT_SERVER);
    addr_sev.sin_addr.s_addr = INADDR_ANY;
   
    if (SOCKET_ERROR == bind(sock_sev, (sockaddr *)&addr_sev, sizeof(addr_sev)))
    {
        cout << "Failed to bind." << endl;
        WSACleanup();
        return 0;
    }

    if(SOCKET_ERROR == listen(sock_sev, NUM_CLIENTS))
    {
        cout << "Failed to listen." << endl;
        WSACleanup();
        return 0;
    }
   
    //SOCKET sock_client;
    sockaddr_in addr_client;
    int nAddrLen = sizeof(addr_client);

    sock_client = accept(sock_sev, (sockaddr *)&addr_client, &nAddrLen);
   
    if (INVALID_SOCKET == sock_client)
    {
        cout << "Failed to accept." << endl;
      
    }

    HANDLE hThread1, hThread2;
    hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsg, NULL, 0, NULL);
    hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendMsg, NULL, 0, NULL);
   
    
    CloseHandle(SendMsg);
    CloseHandle(RecvMsg);
   
    Sleep(200000);  //主线程沉睡200秒

    //cout << "Connection from " << inet_ntoa(addr_client.sin_addr) << endl;         
    closesocket(sock_client);

    return 1;
}

void SendMsg(LPVOID lpParameter)
{
    //cout << "进入发送消息线程" << endl;
    char tmp[50];
   
    while(1)
    {
        cin >> tmp;
        send(sock_client, tmp, strlen(tmp), 0);
    }
}

void RecvMsg(LPVOID lpParameter)
{
    //cout << "进入接收消息线程" << endl;

    char buf[50];
    int recv_size;

    while (1)
    {
        recv_size = recv(sock_client, buf, 512, 0);
   
        if (512 > recv_size && 0 < recv_size)
        {
            buf[recv_size] = '/0';
           
            if(strcmp(buf, "quit") == 0)
            {
                //ExitThread(NULL);退出该线程
                cout << "客户端退出" << endl;
            }else
            {
                cout << "receive data is :" << buf << endl;
            }
            memset(buf, 0, sizeof(buf));
        }
       
    }       
}

 

//客户端

 

#include <winsock2.h>
#include <windows.h>
#include <iostream.h>
#define PORT_SERVER 6666
#pragma comment(lib,"ws2_32.lib")

SOCKET sock_client;

void SendMsg(LPVOID lpParameter);
void RecvMsg(LPVOID lpParameter);

int main(int argc, char* argv[])
{
    cout << "Start up tcp client." << endl;
   
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 0);
    if (0 != WSAStartup(sockVersion, &wsaData))
    {
        cout << "Failed to retrive socket version."
            << endl;
        return 0;
    }
   
   
    sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == sock_client)
    {
        cout << "Invalid socket." << endl;
        WSACleanup();
        return 0;
    }

    sockaddr_in addr_sev;
   
    addr_sev.sin_family = AF_INET;
    addr_sev.sin_port = htons(PORT_SERVER);
    addr_sev.sin_addr.s_addr = inet_addr("127.0.0.1");
   
    if (SOCKET_ERROR == connect(sock_client, (sockaddr *)&addr_sev, sizeof(addr_sev)))
    {
        cout << "Failed to connect." << endl;
        WSACleanup();
        return 0;
    }
   
    cout << "连接成功" << endl;
   
    HANDLE hThread1, hThread2;

    hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendMsg, NULL, 0, NULL);
    hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsg, NULL, 0, NULL);
     
    CloseHandle(SendMsg);
    CloseHandle(RecvMsg);
   
    Sleep(200000);  //主线程沉睡200秒
   
    closesocket(sock_client);
    WSACleanup();

        //system("PAUSE");
    return 0;
}

void SendMsg(LPVOID lpParameter)
{
    //cout << "进入发送消息线程" << endl;
    char tmp[50];
   
    while(1)
    {
        cin >> tmp;
        send(sock_client, tmp, strlen(tmp), 0);
       
        if(strcmp(tmp, "quit") == 0)
        {
            cout << "退出" << endl;
            ExitProcess(NULL);
        }
    }
}

void RecvMsg(LPVOID lpParameter)
{
    //cout << "进入接收消息线程" << endl;
   
    char buf[50];
    int recv_size;
  
    while (1)
    {
        recv_size = recv(sock_client, buf, 512, 0);
   
        if (512 > recv_size && 0 < recv_size)
        {
            buf[recv_size] = '/0';
            cout << "receive data is :" << buf << endl;
            memset(buf, 0, sizeof(buf));
        }
       
    }   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值