C++实现TCP通信

来源:互联网 发布:网络结婚主持台词 编辑:程序博客网 时间:2024/06/14 20:23

服务端

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