*.流式套接字:SOCK_STREAM
*.服务端程序:socket -> bind -> listen -> accept -> send/recv -> close
*.客户端程序:socket -> connect -> send/recv -> close
开发工具:2019
1.编写Server端
创建一个c++空项目,命名为TCPServer,如下图所示:
编写一个简单的示例,接收客户端连接成功后,服务端关闭监听,接收客户端发送的消息,然后断开连接。
代码如下所示:
#pragma comment(lib,"ws2_32.lib") //添加32位链接库,也可以在配置页面添加
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
void main() {
//初始化Windows套接字
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;//客户端连接
SOCKADDR_IN ServerAddr; //服务端地址
SOCKADDR_IN ClientAddr;//客户端地址
int ClientAddrLen;//客户端地址长度
int Port = 5150; //监听端口
int Ret;
char DataBuffer[1024];
if((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)))//使用2.2版本
{
printf("WSAStartup failed with error %d\n", Ret);
return;
}
//创建Windows套接字
if ((ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("socket failed with error %d\n",WSAGetLastError());
WSACleanup();//清理Windows套接字
return;
}
ServerAddr.sin_family = AF_INET;// 定义协议
ServerAddr.sin_port = htons(Port); //本机字节转换为网络字节
ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) //将套接字与地址绑定
{
printf("bind failed with error %d\n",WSAGetLastError());
closesocket(ListeningSocket);//关闭套接字
WSACleanup();
return;
}
if (listen(ListeningSocket, 5) == SOCKET_ERROR) //监听:队列最多放5个连接对象排队等待
{
printf("listen failed with error %d\n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
printf("We are waiting a connecting on port %d.\n",Port);
ClientAddrLen = sizeof(SOCKADDR);
if ((NewConnection = accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen)) == INVALID_SOCKET)
{
printf("accept failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
char buf[20] = { 0 };
inet_ntop(AF_INET, &ClientAddr.sin_addr, buf, sizeof(buf));
printf("We successfully got a connection from %s:%d\n", buf,ntohs(ClientAddr.sin_port));
closesocket(ListeningSocket); //关闭服务端监听
printf("We are waiting to receive data\n");
if ((Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0)) == SOCKET_ERROR)//接收客户端数据
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(NewConnection);
WSACleanup();
return;
}
printf("We successfully received %d bytes.\n",Ret);
DataBuffer[Ret] = '\0';
printf("%s\n",DataBuffer);
closesocket(NewConnection); //关闭客户端连接
WSACleanup();
system("pause");
return;
}
2.编写Client端
创建一个c++空项目,命名为TCPClient,如下图所示:
编写一个简单的示例,接收命令行输入的IP地址,连接服务端,发送消息成功后,关闭连接。
代码如下所示:
#pragma comment(lib,"ws2_32.lib") //添加32位链接库,也可以在配置页面添加
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
void main(int argc,char** argv)
{
WSADATA wsaData;
SOCKET sock; //客户端连接对象
SOCKADDR_IN ServerAddr;//服务端地址
int Ret;
int Port = 5150; //服务端端口
if (argc <= 1)
{
printf("USAGE:TCPClient <Server IP address>.\n");
system("pause");
return;
}
if((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n",Ret);
return;
}
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) //创建windows套接字
{
printf("socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return;
}
ServerAddr.sin_family = AF_INET;//协议
ServerAddr.sin_port =htons(Port);
inet_pton(AF_INET, argv[1], &ServerAddr.sin_addr);//命令行输入连接服务端的IP地址
char buf[10];
inet_ntop(AF_INET, &ServerAddr.sin_addr,buf,sizeof(buf));
printf("We are trying to connect to %s:%d...\n", buf,htons(ServerAddr.sin_port));
if (connect(sock, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)//连接
{
printf("connect failed with error %d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return;
}
printf("Our connection successed.\n");
printf("We will now try to send a hello message.\n");
if ((Ret = send(sock, "hello", 5, 0)) == SOCKET_ERROR) //发送数据
{
printf("send failed with error %d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return;
}
printf("We successfully sent %d bytes.\n",Ret);
closesocket(sock);
WSACleanup();
system("pause");
}
3.运行TCPServer和TCPClient
代码链接:https://download.csdn.net/download/qq_31461977/88478343