C++ TCP winsock 多線程編程

kdloeki 9年前發布 | 4K 次閱讀 C/C++

// 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,0x00,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,0,ClientThread,(LPVOID)clientScoket,0,NULL); if(hThread == NULL) { cout<<"creat thread failed"<<endl; break; } CloseHandle(hThread); } closesocket(severScoket); closesocket(clientScoket); WSACleanup(); return 0; } </pre>
// 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,2),&WSA)!= 0 ) { cout<<"init failed"<<endl; return -1; } //creat socket clientScoket = socket(AF_INET,SOCK_STREAM,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,0x00,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;

}</pre>

 本文由用戶 kdloeki 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!