加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++ TCP winsock 多线程编程

发布时间:2020-12-16 07:46:20 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 // Thread.cpp : 定义控制台应用程序的入口点。// #include "stdafx.h"#include stdio.h#include stdlib.h#include winsock2.h#include iostream#prag

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

// Thread.cpp : 定义控制台应用程序的入口点。
//
  
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
  
  
#define PORT 4000
#define IP_ADDRESS "127.0.0.1"
  
//创建线程
DWORD WINAPI ClientThread (LPVOID ipParameter)
{
    SOCKET ClientScoket  = (SOCKET)ipParameter;
    int RET =  0;
    char RecvBuffer[MAX_PATH];
    //初始化 recvBuffer
    while(true){
    memset(RecvBuffer,0x00,sizeof(RecvBuffer));
    RET  =  recv(ClientScoket,RecvBuffer,MAX_PATH,0);
    if(RET == 0||RET == SOCKET_ERROR)
    {
        cout<<"failed,exit"<<endl;
        break;
    }
    cout<<"接受的消息为"<<RecvBuffer<<endl;
    }
  
    return 0;  
}
int main(void)
{
    WSADATA     WSA;
    SOCKET      severScoket,clientScoket;
    struct      sockaddr_in  LocalAddr,clientAddr;
    int         AddrLen =  0;
    HANDLE      hThread =  NULL;
    int         RET = 0;
    //init windows socket
    if (WSAStartup(MAKEWORD(2,2),&WSA)!= 0 )
    {
        cout<<"init failed"<<endl;
        return -1;
    }
    //creat socket
    severScoket = socket(AF_INET,SOCK_STREAM,0);
    if(severScoket == INVALID_SOCKET)
    {
      cout<<"creat failed"<<GetLastError()<<endl;
      return -1;
    }
    LocalAddr.sin_family = AF_INET;
    LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    LocalAddr.sin_port = htons(PORT);
    memset(LocalAddr.sin_zero,8);
    //bind socket
    RET = bind(severScoket,(struct sockaddr*)&LocalAddr,sizeof(LocalAddr));
    if (RET != 0)
    {
        cout<<"bind failed";
        return -1;
    }
    RET = listen(severScoket,5);
    if (RET!= 0)
    {
        cout<<"listen failed";
        return -1;
    }
    cout<<"服务器已启动"<<endl;
    while(true)
    {
       AddrLen = sizeof(clientAddr);
       clientScoket = accept(severScoket,(struct sockaddr*)&clientAddr,&AddrLen);
       if (clientScoket ==INVALID_SOCKET)
       {
           cout<<"accept failed";
           break;
       }
       cout<<"客户端连接"<<inet_ntoa(clientAddr.sin_addr)<<"."<<clientAddr.sin_port<<endl;
       hThread  = CreateThread(NULL,ClientThread,(LPVOID)clientScoket,NULL);
       if(hThread == NULL)
       {
           cout<<"creat thread failed"<<endl;
           break;
       }
       CloseHandle(hThread);
    }
    closesocket(severScoket);
    closesocket(clientScoket);
    WSACleanup();
    return 0;
}
  

//?Client.cpp?:?定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
  
  
#define PORT 4000
#define IP_ADDRESS "127.0.0.1"
int main(void)
{
    WSADATA     WSA;
    SOCKET      clientScoket;
    struct      sockaddr_in  serveAddr;
    int         AddrLen =  0;
    HANDLE      hThread =  NULL;
    int         RET = 0;
    char        SendBuffer[MAX_PATH];
    //init windows socket
    if (WSAStartup(MAKEWORD(2,&WSA)!= 0 )
    {
        cout<<"init failed"<<endl;
        return -1;
    }
    //creat socket
    clientScoket = socket(AF_INET,0);
    if(clientScoket == INVALID_SOCKET)
    {
        cout<<"creat failed"<<GetLastError()<<endl;
        return -1;
    }
    serveAddr.sin_family = AF_INET;
    serveAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    serveAddr.sin_port = htons(PORT);
    memset(serveAddr.sin_zero,8);
  
    RET = connect(clientScoket,(struct sockaddr*)&serveAddr,sizeof(serveAddr));
    if (RET != 0)
    {
        cout<<"connect failed";
        return -1;
    }
    else{ cout<<"链接成攻"<<endl;}
    while(true)
    {
        cin.getline(SendBuffer,sizeof(SendBuffer));
        RET = send(clientScoket,SendBuffer,(int)strlen(SendBuffer),0);
        if (RET == SOCKET_ERROR)
        {
            cout<<"send to error"<<endl;
            break;
        }
    }
    closesocket(clientScoket);
    WSACleanup();
    return 0;
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读