Vs2013搭建socket服务器/客户端,开线程thread

来源:互联网 发布:中央数据交换平台 编辑:程序博客网 时间:2024/05/21 11:03

话不多说,先传代码

服务器:

#include <Winsock2.h>#include <stdio.h>#include <windows.h> #include <iostream>#include <thread>//using namespace std;#pragma comment(lib,"ws2_32.lib")void main(){    void foo(SOCKET sClient);    WORD wVersionRequested;    WSADATA wsaData;    int err;    wVer`sionRequested = MA`KEWORD(1, 1);    err = WSAStartup(wVersionRequested, &wsaData);    if (err != 0) {        return;    }    if (LOBYTE(wsaData.wVersion) != 1 ||        HIBYTE(wsaData.wVersion) != 1) {        WSACleanup();        return;    }    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);    SOCKADDR_IN addrSrv;    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    addrSrv.sin_family = AF_INET;    addrSrv.sin_port = htons(6000);    bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));    listen(sockSrv, 5);    SOCKADDR_IN addrClient;    int len = sizeof(SOCKADDR);    char revData[255];    char sendToData[255];    printf("等待连接...\n");    SOCKET sClient = accept(sockSrv, (SOCKADDR *)&addrClient, &len);    printf("接受到一个连接:%s \r\n", inet_ntoa(addrClient.sin_addr));    std::thread t1(foo, sClient);    t1.detach();    while (1)    {        //发送数据        memset(sendToData, 0, sizeof(sendToData));        std::cin >> sendToData;        send(sClient, sendToData, strlen(sendToData), 0);    }    closesocket(sClient);}void foo(SOCKET sClient){    char revData[255];    while (1)    {        //接收数据          int ret = recv(sClient, revData, 255, 0);        if (ret > 0)        {            revData[ret] = 0x00;            printf("接收消息:%s\n", revData);        }    }}

客户端

#include <Winsock2.h>#include <stdio.h>#include <iostream>#include <thread>//using namespace std;#pragma  comment(lib,"ws2_32.lib") void main(int argc, char* argv[]){    void foo(SOCKET sclient);    WORD sockVersion = MAKEWORD(2, 2);    WSADATA data;    if (WSAStartup(sockVersion, &data) != 0)    {        return;    }    SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (sclient == INVALID_SOCKET)    {        printf("invalid socket !");        return;    }    sockaddr_in serAddr;    serAddr.sin_family = AF_INET;    serAddr.sin_port = htons(6000);    serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");    //请求服务器的地址    connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr));    char recData[255];    char sendToData[255];    char* sendData = "你好,TCP服务端,我是客户端!\n";    send(sclient, sendData, strlen(sendData), 0);    std::thread t1(foo, sclient);    t1.detach();    while (1)    {        //发送数据        memset(sendToData, 0, sizeof(sendToData));        std::cin >> sendToData;        send(sclient, sendToData, strlen(sendToData), 0);    }    closesocket(sclient);    WSACleanup();    return;}void foo(SOCKET sclient){    char recData[255];    //接收消息    while (1)    {        int ret = recv(sclient, recData, 255, 0);        if (ret > 0)        {            recData[ret] = 0x00;            printf("接收:%s\n", recData);        }    }}

遇到的最主要的问题就是c++11中的thread会影响到socket,形成非阻塞,这个需要去掉std;这样就能完美解决。
结果图

亲测可用,本人也是新手,以后想到什么写什么吧。

0 0
原创粉丝点击