目录
整体步骤:
1.加载库 --WSAStartup();
2.创建套接字 --socket();
3.绑定端口号 -- bind();
4.监听 --listen();
5.交接 --accept();
while(1)
{
6.recv();
7.send();
}
8.关闭套接字
9.卸载库
过程中在包头加包长度解决了TCP粘包问题
TCPServer:
main:
#include <QCoreApplication>
#include <winsock2.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//1.选择种类 --加载库 --WSAStartup();
//2.雇店长 --创建套接字 --socket();
//3.找地 --绑定 --bind();
//4.店长宣传 --监听 --listen();
//5.店长接收客人,交给服务员 --接收连接 --accept();
//6.客人与服务员,等待客人说话 --recv();
//7.回复 --send();
//8.下班 --closesocket();
//9.关门 --WSACleanup();
//加载库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//创建套接字
SOCKET socklisten = socket(AF_INET,SOCK_STREAM,0);
if(socklisten == INVALID_SOCKET)
{
WSACleanup();
return 1;
}
//设置地址信息
sockaddr_in addrserver;
addrserver.sin_addr.S_un.S_addr = 0;
addrserver.sin_family = AF_INET;
addrserver.sin_port = htons(8899);
//绑定地址信息
if(bind(socklisten,(sockaddr*)&addrserver,sizeof(addrserver)) == SOCKET_ERROR)
{
closesocket(socklisten);
WSACleanup();
return 1;
}
//监听
if(listen(socklisten,10) == SOCKET_ERROR)
{
closesocket(socklisten);
WSACleanup();
return 1;
}
//连接
sockaddr_in addrclient;
int nSize = sizeof (addrclient);
cout << "Wait for the client to connect...." << endl;
SOCKET sockWaiter = accept(socklisten,(sockaddr*)&addrclient,&nSize);
cout << "Client:" << inet_ntoa(addrclient.sin_addr) << " connect success" << endl;
//收发数据
char* pszbuf = nullptr;
int nPackSize;
int nRecvNum;
while(1)
{
//接收包大小
nRecvNum = recv(sockWaiter,(char*)&nPackSize,sizeof (int),0);
if(nRecvNum <= 0)
{
continue;
}
//接受包内容
pszbuf = new char[nPackSize];
int offset = 0;
while(nPackSize)
{
nRecvNum = recv(sockWaiter,pszbuf + offset,nPackSize,0);
if(nRecvNum > 0)
{
offset += nRecvNum;
nPackSize -= nRecvNum;
}
}
cout << "Client:" << inet_ntoa(addrclient.sin_addr) << "say:" << pszbuf << endl;
cin >> pszbuf;
send(sockWaiter,pszbuf,sizeof (pszbuf),0);
delete []pszbuf;
pszbuf = nullptr;
}
//关闭
closesocket(socklisten);
closesocket(sockWaiter);
WSACleanup();
return a.exec();
}
TCPClient:
main:
#include <QCoreApplication>
#include <winsock2.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//1.WSAStartup();
//2.socket();
//3.connect();
//4.send();
//5.recv();
//6.closesocket();
//7.WSACleanup();
//加载库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//创建套接字
SOCKET sockclient = socket(AF_INET,SOCK_STREAM,0);
if(sockclient == INVALID_SOCKET)
{
WSACleanup();
return 1;
}
//连接
sockaddr_in addrserver;
addrserver.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrserver.sin_family = AF_INET;
addrserver.sin_port = htons(8899);
if(SOCKET_ERROR == connect(sockclient,(sockaddr*)&addrserver,sizeof(addrserver)))
{
closesocket(sockclient);
WSACleanup();
return 1;
}
//收发数据
char szbuf[1024] = {0};
int nPackSize = sizeof(szbuf);
int nRecvNum;
while(1)
{
cin >> szbuf;
//发送包大小
send(sockclient,(char*)&nPackSize,sizeof(int),0);
//发送包内容
send(sockclient,szbuf,sizeof(szbuf),0);
nRecvNum = recv(sockclient,szbuf,sizeof(szbuf),0);
if(nRecvNum > 0)
{
cout << "Server:" << inet_ntoa(addrserver.sin_addr) << "say:" << szbuf << endl;
}
}
closesocket(sockclient);
WSACleanup();
return a.exec();
}