#include <Winsock2.h>
#include <iostream>
#include <windows.h>
using namespace std;
const int maxn=10;
/*
服務器端
*/
//有socket獲取ip
string getIpAddressBySocket(SOCKET socket)
{
SOCKADDR_IN socket_addr;
memset(&socket_addr,0,sizeof(socket_addr));
int addr_len=sizeof(socket_addr);
getpeername(socket,(SOCKADDR*)&socket_addr,&addr_len);
return inet_ntoa(socket_addr.sin_addr);
}
//顯示線程
unsigned int __stdcall handleRecvFromClient(void* arg)
{
char recvBuf[512];
int irecvLen;
//int socket=(SOCKET)(LPVOID)arg;
SOCKET* psocket=(SOCKET*)arg;
SOCKET socket=*psocket;
//cout<<"Thread start "<<endl;
while (1)
{
memset(recvBuf, 0, 512);
irecvLen = recv(socket, recvBuf, sizeof(recvBuf), 0);
if (irecvLen == SOCKET_ERROR)
{
cout << "rcv() failed:" << WSAGetLastError() << endl;
break;
}
else
{
cout << "receive from " << getIpAddressBySocket(socket)<<":"<<recvBuf << endl;
cout<<"--------------------------------------------\n";
}
if (strcmp(recvBuf, "quit") == 0)
break;
}
closesocket(socket);
}
//接受線程
unsigned int __stdcall handleSendToClient(void* arg)
{
char sendBuf[512];
//int socket=(SOCKET)(LPVOID)arg;
SOCKET* psocket=(SOCKET*)arg;
SOCKET socket=*psocket;
while (1)
{
cout<<">>";
cin >> sendBuf;
cout<<"--------------------------------------------\n";
int isndLen = send(socket, sendBuf, sizeof(sendBuf), 0);
if(isndLen == 0)
return 0;
else if(isndLen == SOCKET_ERROR)
{
cout << "send failed:" << WSAGetLastError() << endl;
return 0;
}
if (strcmp(sendBuf, "quit") == 0)
break;
}
closesocket(socket);
}
int main()
{
WSADATA wsaData;
//僅僅只是用來監聽的
SOCKET server_socket;
//要和server_socket綁定的服務器段地址
struct sockaddr_in server_addr;
//接受的新的連接請求
SOCKET client_socket;
//加載winsocket版本
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
cout << "winsock load failed" << endl;
return 0;
}
cout << "server online" << endl;
cout<<"--------------------------------------------\n";
//TCP協議,基於流式的
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == INVALID_SOCKET)
{
cout << "socket init failed:" << WSAGetLastError() << endl;
return 0;
}
//端口,ip
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5050);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//套接字綁定到本地地址上監聽
if (bind(server_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR)
{
cout << "bind failed:" << WSAGetLastError() << endl;
return 0;
}
//進入無限期的監聽狀態
if (listen(server_socket, 5) == SOCKET_ERROR)
{
cout << "listen() failed:" << WSAGetLastError() << endl;
return 0;
}
//while(true)
//{
struct sockaddr_in clientAddr;
int iLen = sizeof(clientAddr);
//接受一個新的請求
client_socket = accept(server_socket, (struct sockaddr*)&clientAddr, &iLen);
if (client_socket == INVALID_SOCKET)
{
cout << "accept failed:" << WSAGetLastError() << endl;
return 0;
}
//開啓線程的三種方法
//pthread_create(&pthread[pos],NULL,handleClient,(void*)&pos);
//HANDLE hThread=CreateThread(NULL,NULL, handleClient,(LPVOID)client_socket, 0, NULL);
HANDLE hThread_recv=(HANDLE)_beginthreadex(NULL,NULL, handleRecvFromClient,&client_socket, 0, NULL);
HANDLE hThread_send=(HANDLE)_beginthreadex(NULL,NULL, handleSendToClient,&client_socket, 0, NULL);
//等待線程跑完
WaitForSingleObject(hThread_recv,INFINITE);
WaitForSingleObject(hThread_send,INFINITE);
//}
closesocket(server_socket);
WSACleanup();
}
客戶端比較簡單,如下:
#include<winsock2.h>
#include<iostream>
#include <windows.h>
//#include<stdio.h>
using namespace std;
#define DATA_BUFFER 512
string getIpAddressBySocket(SOCKET socket)
{
SOCKADDR_IN socket_addr;
memset(&socket_addr,0,sizeof(socket_addr));
int addr_len=sizeof(socket_addr);
getpeername(socket,(SOCKADDR*)&socket_addr,&addr_len);
return inet_ntoa(socket_addr.sin_addr);
}
unsigned int __stdcall handleRecv(void* arg)
{
char recvBuf[DATA_BUFFER];
SOCKET *psocket=(SOCKET*)arg;
SOCKET socket=*psocket;
int recvLen;
while(true)
{
recvLen = recv(socket, recvBuf, sizeof(recvBuf), 0);
if (recvLen == SOCKET_ERROR)
{
cout << "receive failed:" << WSAGetLastError() << endl;
break;
}
else
{
cout<<"Receive from "<<getIpAddressBySocket(socket)<<" : "<<recvBuf<<endl;
cout<<"--------------------------------------------\n";
}
}
closesocket(socket);
}
int main()
{
WSADATA wsaData;
SOCKET client_socket;
int isndLen;
char sndbuf[DATA_BUFFER];
memset(sndbuf, 0, DATA_BUFFER);
char * serverIp = "127.0.0.1";
int port = 5050;
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(serverIp);
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
cout << "failed to load winsock" << endl;
return 0;
}
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if(client_socket == INVALID_SOCKET)
{
cout << "socket() failed :" << WSAGetLastError() << endl;
return 0;
}
if(connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == INVALID_SOCKET)
{
cout << "connect() failed: " << WSAGetLastError() << endl;
return 0;
}
else
{
HANDLE handle=(HANDLE)_beginthreadex(NULL,NULL, handleRecv,&client_socket, 0, NULL);
while(1)
{
cout<<">>";
cin >> sndbuf;
cout<<"--------------------------------------------\n";
isndLen = send(client_socket, sndbuf, sizeof(sndbuf), 0);
if(isndLen == 0)
return 0;
else if(isndLen == SOCKET_ERROR)
{
cout << "send() failed:" << WSAGetLastError() << endl;
return 0;
}
}
}
closesocket(client_socket);
WSACleanup();
return 0;
}