//Sever
#include "stdafx.h"
#include<WinSock2.h>
#include<windows.h>
#include<iostream>
using namespace std;
#pragma comment (lib,"ws2_32.lib")
#define PORT 6000
DWORD WINAPI clientProc(LPVOID lparam)
{
//为客户端服务
SOCKET sockClient = (SOCKET)lparam;
CHAR szbuf[1024];
while (TRUE)
{
memset(szbuf, 0, 1024);
int ret = recv(sockClient, szbuf, sizeof(szbuf), 0);
if (ret== SOCKET_ERROR)
{
cout << "服务器接受失败" << endl;
return -1;
}
if (ret==0)
{
cout << "客户端关闭连接" << endl;
return -1;
}
cout << "Sever:" << szbuf << endl;
ret = send(sockClient, szbuf, sizeof(szbuf), 0);
if (ret==SOCKET_ERROR)
{
cout << "服务器发送数据失败" << endl;
return -1;
}
}
closesocket(sockClient);
return 0;
}
//初始网络环境失败
bool InitNetEnv()
{
WSADATA wd;
if (WSAStartup(MAKEWORD(2, 2), &wd) != 0)
{
cout << "初始网络环境失败" << endl;
return false;
}
return true;
}
//TCP Sever
int main()
{
if (!InitNetEnv())
{
return -1;
}
cout << "初始网络环境成功" << endl;
//创建套接字
SOCKET sSever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sSever==INVALID_SOCKET)
{
cout << "创建套接字失败" << endl;
return -1;
}
cout << "创建套接字成功" << endl;
//初始化网络节点
SOCKADDR_IN addrSever;
addrSever.sin_family = AF_INET; //IPV4
addrSever.sin_port = htons(PORT);
addrSever.sin_addr.S_un.S_addr = INADDR_ANY; //服务器上所有的网卡的IP地址
//进行绑定
int ret = bind(sSever, (sockaddr *)&addrSever, sizeof(sockaddr));
if (ret==SOCKET_ERROR)
{
cout << "套接字绑定失败" << endl;
return -1;
}
cout << "套接字绑定成功" << endl;
ret=listen(sSever, SOMAXCONN); //进行监听
if (ret == SOCKET_ERROR)
{
cout << "服务器监听失败" << endl;
return -1;
}
cout << "服务器监听成功" << endl;
//监听成功,接受客户端的连接请求
SOCKADDR_IN addrClient;
int addrClinetLen = sizeof(SOCKADDR_IN);
while (TRUE)
{
SOCKET *sClient = new SOCKET;
//接受连接,accept是阻塞型函数,如果没有客户端连接,会卡在这里
*sClient=accept(sSever,(sockaddr *)&addrClient,&addrClinetLen);
if (*sClient==INVALID_SOCKET)
{
cout << "接受客户端请求失败" << endl;
WSACleanup();
closesocket(sSever);
return -1;
}
cout << "接受客户端请求成功" << endl;
//为客户端创建线程处理
CreateThread(NULL, 0, clientProc,(LPVOID)*sClient, NULL, NULL);
Sleep(10);
}
closesocket(sSever);
WSACleanup();
return 0;
}
//Client
#include "stdafx.h"
#include<WinSock2.h>
#include<windows.h>
#include<iostream>
using namespace std;
#pragma comment (lib,"ws2_32.lib")
#define PORT 6000
//TCP Client
//初始化网络环境
bool InitNetEnv()
{
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa)!=0)
{
cout << "初始化网络环境失败" << endl;
return false;
}
return true;
}
int main()
{
if (!InitNetEnv())
{
return -1;
}
//创建一个套接字socket
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient==INVALID_SOCKET)
{
cout << "创建套接字失败" << endl;
WSACleanup();
return -1;
}
//初始化网络节点
SOCKADDR_IN si;
si.sin_family = AF_INET;
si.sin_port = htons(PORT);
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//连接
int ret = connect(sClient, (sockaddr *)&si, sizeof(sockaddr));
if (ret==SOCKET_ERROR)
{
cout << "网络连接失败"<<endl;
WSACleanup();
closesocket(sClient);
return -1;
}
char szbuf[2048];
memset(szbuf, 0, sizeof(szbuf));
sprintf_s(szbuf,2048, "hello my first socket Sever");
//向服务器发送消息
ret = send(sClient, szbuf, strlen(szbuf), 0);
if (ret == SOCKET_ERROR)
{
cout << "客户端发送失败" << endl;
WSACleanup();
closesocket(sClient);
return -1;
}
//接受从服务器发回来的消息
ret = recv(sClient, szbuf, sizeof(szbuf), 0);
if (ret == SOCKET_ERROR)
{
cout << "客户端接收失败" << endl;
WSACleanup();
closesocket(sClient);
return -1;
}
cout << "client:" << szbuf << endl;
//关闭套接字,释放网络环境
closesocket(sClient);
WSACleanup();
return 0;
}