C++ TCP winsock 多線程編程
// 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>