//TCP_server.h
#pragma once
#include <iostream>
#include <WINSOCK2.H>
#include <windows.h>
#include <stdio.h>
#include<string>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
#include <string.h>
using namespace std;
class Fun_server
{
public:
//Fun_server() { sockfd = INVALID_SOCKET; }
//~Fun_server() { sockfd = INVALID_SOCKET; }
//创建套接字
bool Createsocket();
//bind绑定端口 和ip
bool Bind();
//listen监听
bool Listen(int num);
//accept接收
bool Accept();
//建立连接客户端调用
bool Connect();
//发送数据
void Send();
//接收数据
//void Recv();
void Recv();
//关闭
void Close();
private:
SOCKET sockfd;
SOCKET confd;
};
// TCP_server.cpp : 定义静态库的函数。
#include "pch.h"
#include "framework.h"
#include "TCP_server.h"
DWORD WINAPI Fun(LPVOID lpParamter);
// TODO: 这是一个库函数示例
void fnTCPserver()
{
}
bool Fun_server::Createsocket()
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建了可识别套接字
if (sockfd == INVALID_SOCKET)
{
cout << "socket error" << endl;
return false;
}
return true;
}
bool Fun_server::Bind()
{
//需要绑定的参数
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//IP地址
addr.sin_port = htons(6000);//绑定端口
if (bind(sockfd, (SOCKADDR*)&addr, sizeof(SOCKADDR)) == SOCKET_ERROR) //绑定完成
{
cout << "bind error" << endl;
Close();
return false;
}
return true;
}
bool Fun_server::Listen(int num)
{
if (listen(sockfd, num) == SOCKET_ERROR)
{
cout << "listen error" << endl;
return false;
}
return true;
}
bool Fun_server::Accept()
{
SOCKADDR_IN clientsocket;
int len = sizeof(SOCKADDR);
confd = accept(sockfd, (SOCKADDR*)&clientsocket, &len);
if (confd == INVALID_SOCKET)
{
cout << "accept error" << endl;
return false;
}
//创建一个子线程
HANDLE hThread = CreateThread(NULL, 0, Fun, (LPVOID)confd, 0, NULL);
char Buf[100];
sprintf(Buf, "ip: %s 连接成功", inet_ntoa(clientsocket.sin_addr));
cout << Buf << endl;
//=======================================
return true;
}
bool Fun_server::Connect()
{
//需要绑定的参数
SOCKADDR_IN client_in;
client_in.sin_family = AF_INET;
client_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//IP地址
client_in.sin_port = htons(6000);//绑定端口
int ret = connect(sockfd, (SOCKADDR*)&client_in, sizeof(SOCKADDR));
if (ret == SOCKET_ERROR)
{
cout << "conect error" << endl;
return false;
}
else
{
cout << "连接服务器成功" << endl;
}
//=========================================
return true;
}
void Fun_server::Send()
{
string BUF;
while (1)
{
getline(cin, BUF);
const char* s_buf = BUF.c_str();
//sprintf(s_buf2, "%s",s_buf);
send(sockfd, s_buf, strlen(s_buf) + 1, 0);
if (!strncmp(s_buf, "quit", 4))
{
break;
}
}
}
void Fun_server::Recv()
{
char getbuf[100];//接收
while (1)
{
memset(getbuf, 0, sizeof(getbuf));
int len = recv(confd, getbuf, sizeof(getbuf), 0);
getbuf[len] = '\0';
if (!strncmp(getbuf, "quit", 4))
{
break;
}
cout << "from client:" << getbuf << endl;
}
}
void Fun_server::Close()
{
closesocket(sockfd);
sockfd = INVALID_SOCKET;
}
//子线程实现发送消息给client
DWORD WINAPI Fun(LPVOID lpParamter)
{
SOCKET confd = (SOCKET)lpParamter;
string BUF;
while (1)
{
getline(cin, BUF);
const char* s_buf = BUF.c_str();
//sprintf(s_buf2, "%s",s_buf);
send(confd, s_buf, strlen(s_buf) + 1, 0);
if (!strncmp(s_buf, "quit", 4))
{
break;
}
}
return 0;
}
// server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include"TCP_server.h"
int main()
{
cout << "this is server" << endl;
Fun_server w;
//创建套接字 设置套接字版本,并启用
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest = MAKEWORD(1, 1);
int err;
err = WSAStartup(myVersionRequest, &wsaData);
if (!err)
{
cout << "已打开套接字" << endl;
}
else
{
//进一步绑定套接字
cout << "嵌套接字未打开" << endl;
return -1;
}
if (!w.Createsocket())
{
return 0;
}
if (!w.Bind())
{
return 0;
}
int a = 4;
if (!w.Listen(a))
{
return 0;
}
// Fun_server w;
if (!w.Accept())
{
return 0;
}
w.Recv();
w.Close();
WSACleanup();//释放资源的操作
return 0;
}
client :
//myclient.h
#pragma once
#include <iostream>
#include <WINSOCK2.H>
#include <windows.h>
#include <stdio.h>
#include<string>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#include <string.h>
#ifdef _WIN32
#define MYDLL_EXPORT extern "C" _declspec(dllexport)
#else
#define MYDLL_EXPORT extern "C" _attribute_ ((visibility("default")))
#endif
MYDLL_EXPORT int Createsocket();
MYDLL_EXPORT int Connect();
//发送数据
MYDLL_EXPORT void Send();
//接收数据
MYDLL_EXPORT void Recv();
//关闭
MYDLL_EXPORT void Close();
MYDLL_EXPORT DWORD WINAPI Fun(LPVOID lpParamter);
//myclient.cpp
#include "pch.h"
#include "myclient.h"
#include "myclient.h"
SOCKET sockfd;
int Createsocket()
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建了可识别套接字
if (sockfd == INVALID_SOCKET)
{
cout << "socket error" << endl;
return -1;
}
return 0;
}
int Connect()
{
SOCKADDR_IN client_in;
client_in.sin_family = AF_INET;
client_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//IP地址
client_in.sin_port = htons(6000);//绑定端口
int ret = connect(sockfd, (SOCKADDR*)&client_in, sizeof(SOCKADDR));
if (ret == SOCKET_ERROR)
{
cout << "conect error" << endl;
return -1;
}
else
{
cout << "连接服务器成功" << endl;
}
//创建一个子线程
HANDLE hThread = CreateThread(NULL, 0, Fun, (LPVOID)sockfd, 0, NULL);
return 0;
}
void Send()
{
string BUF;
while (1)
{
getline(cin, BUF);
const char* s_buf = BUF.c_str();
//sprintf(s_buf2, "%s",s_buf);
send(sockfd, s_buf, strlen(s_buf) + 1, 0);
if (!strncmp(s_buf, "quit", 4))
{
break;
}
}
}
/* void Recv()
{
char getbuf[100];//接收
while (1)
{
memset(getbuf, 0, sizeof(getbuf));
int len = recv(confd, getbuf, sizeof(getbuf), 0);
getbuf[len] = '\0';
if (!strncmp(getbuf, "quit", 4))
{
break;
}
cout << "from client:" << getbuf << endl;
}
}*/
void Close()
{
closesocket(sockfd);
sockfd = INVALID_SOCKET;
}
//子线程实现接收来自server的消息
DWORD WINAPI Fun(LPVOID lpParamter)
{
SOCKET confd = (SOCKET)lpParamter;
char getbuf[100];//接收
while (1)
{
memset(getbuf, 0, sizeof(getbuf));
int len = recv(confd, getbuf, sizeof(getbuf), 0);
getbuf[len] = '\0';
if (!strncmp(getbuf, "quit", 4))
{
break;
}
cout << "from server:" << getbuf << endl;
}
return 0;
}
// Client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include "myclient.h"
DWORD WINAPI Fun(LPVOID lpParamter);
int main()
{
cout << "this is client" << endl;
//创建套接字 设置套接字版本,并启用
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest = MAKEWORD(1, 1);
int err;
err = WSAStartup(myVersionRequest, &wsaData);
if (!err)
{
cout << "已打开套接字" << endl;
}
else
{
//进一步绑定套接字
cout << "嵌套接字未打开" << endl;
return -1;
}
Createsocket();
Connect();
Send();
Close();
WSACleanup();//释放资源的操作
return 0;
}
运行:先运行server 再运行client