C++实现多线程socket通信,可多连接

来源:互联网 发布:模拟羊水声音软件 编辑:程序博客网 时间:2024/05/17 03:25

服务端

#include "InitSock.h"#include <stdio.h>#include <iostream>#include <string.h>#include<WS2tcpip.h>#include<cstring>using namespace std;CInitSock initSock; // 初始化Winsock库struct KK{    SOCKET sClient;    char ip[20];    KK()    {        sClient = 0;    }};KK con[100];int num = 0;// 创建套节字SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);DWORD _stdcall go(LPVOID IpParamenter){    KK *temp = (KK *)IpParamenter;    char buff[256];    while (true)    {        int nRecv = ::recv(temp->sClient, buff, 256, 0);        if (nRecv > 0)        {            buff[nRecv] = '\0';            printf(" 接收 %s:%s\n", temp->ip, buff);        }    }    return 0;}DWORD _stdcall find(LPVOID IpParamenter){    while (true)    {        con[num].sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);        if (con[num].sClient == INVALID_SOCKET)        {            printf("Failed accept()");        }        char sendBuf[20] = { '\0' };        inet_ntop(AF_INET, (void*)&remoteAddr.sin_addr, sendBuf, 16);        printf("接受到一个连接:%s \r\n", sendBuf);        strcpy(con[num].ip, sendBuf);        CreateThread(NULL, 0, go, &con[num], 0, NULL);        num++;    }    return 0;}int main(){    if (sListen == INVALID_SOCKET)    {        printf("Failed socket() \n");        return 0;    }    // 填充sockaddr_in结构    sockaddr_in sin;    sin.sin_family = AF_INET;    sin.sin_port = htons(8888);    sin.sin_addr.S_un.S_addr = INADDR_ANY;    // 绑定这个套节字到一个本地地址    if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)    {        printf("Failed bind() \n");        return 0;    }    // 进入监听模式    if (::listen(sListen, 2) == SOCKET_ERROR)    {        printf("Failed listen() \n");        return 0;    }    // 循环接受客户的连接请求    SOCKET sClient = 0;    char szText[] = " TCP Server Demo! \r\n";    CreateThread(NULL, 0, find, NULL, 0, NULL);    while (TRUE)    {        // 向客户端发送数据        cin >> szText;        for (int i = 0; i < num; i++)        {            ::send(con[i].sClient, szText, strlen(szText), 0);        }            // 从客户端接收数据        }    // 关闭同客户端的连接    ::closesocket(sClient);    // 关闭监听套节字    ::closesocket(sListen);    return 0;}

客户端

#include "InitSock.h"#include <stdio.h>#include <iostream>#include<WS2tcpip.h>using namespace std;CInitSock initSock; // 初始化Winsock库char buff[256];SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);DWORD _stdcall go(LPVOID IpParamenter){    while (TRUE)    {        int nRecv = ::recv(s, buff,900, 0);        if (nRecv > 0)        {            buff[nRecv] = '\0';            printf("接收到数据:%s\n", buff);        }    }    return 0;}int main(){    CreateThread(NULL, 0, go, NULL, 0, NULL);    // 创建套节字    //SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);            if (s == INVALID_SOCKET)        {            printf(" Failed socket() \n");            return 0;        }        // 也可以在这里调用bind函数绑定一个本地地址        // 否则系统将会自动安排        // 填写远程地址信息        sockaddr_in servAddr;        servAddr.sin_family = AF_INET;        servAddr.sin_port = htons(2001);        // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址        // 如果你的计算机没有联网,直接使用127.0.0.1即可        inet_pton(AF_INET, "192.168.1.1", (void*)&servAddr.sin_addr.S_un.S_addr);        if (::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)        {            printf(" Failed connect() \n");            return 0;        }        cout << "connect succeed!\n";        char szText[256];       /*while (TRUE)    {        //从服务器端接收数据        /*int nRecv = ::recv(s, buff, 256, 0);        if (nRecv > 0)        {            buff[nRecv] = '\0';            printf("接收到数据:%s\n", buff);        }*/        // 向服务器端发送数据    /*  Sleep(1000);        strcpy_s(szText,"1023\n");        szText[255] = '\0';        ::send(s, szText, strlen(szText), 0);    }*/    // 关闭套节字    ::closesocket(s);    return 0;}
原创粉丝点击