发布时间:2023-01-14 20:30
#1、Winodws服务端
服务端编程主要由下面几个步骤组成,
1、初始化套接字库
2、创建套接字
3、配置本机地址信息
4、绑定套接字
5、进行监听
6、接受请求
7、传输数据
源代码如下:
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define SERVER_PORT 8000
int main()
{
//1、 初始化套接字库
WSADATA wsaDate;
WORD wVersion = MAKEWORD(1, 1); //选择版本
int err;
err = WSAStartup(wVersion, &wsaDate);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaDate.wVersion) != 1 || HIBYTE(wsaDate.wVersion) != 1)
{
WSACleanup();
return -1;
}
// 2、创建套接字
SOCKET serverSock = socket(AF_INET, SOCK_STREAM, 0);
// 3、配置主机信息
SOCKADDR_IN serverAddr;
/***************************************
*第一句代码:配置本机IP地址 htonl函数的意思是 host to network long 将主机字节序转换为网络字节序
* 由于网络数据传输采用的是大端存储方式,而X86系列机器采用的是小端存储方式
*第三句:配置端口号,端口号是由自己指定的
**************************************/
serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
// 4、绑定到主机
bind(serverSock, (SOCKADDR *)&serverAddr, sizeof(SOCKADDR));
// 5、监听
listen(serverSock, 128);
std::cout << "等待客户连接...\n";
//创建套接字来保存连入的客户机的IP地址及端口号信息
SOCKADDR_IN clientAddr;
SOCKET clientSock;
char revBuf[128];
char sedBuf[128];
int len = sizeof(SOCKADDR);
sprintf_s(sedBuf, 128, "Hello,my server?");
// 6、接受请求
while (true)
{
//接受客户socket
clientSock = accept(serverSock, (SOCKADDR *)&clientAddr, &len);
// 7、传输数据
//接收数据
recv(clientSock, revBuf, sizeof(revBuf), 0);
//发送数据
std::cout << "received:" << revBuf << '\n';
std::cout << "send message:" << sedBuf << '\n';
send(clientSock, sedBuf, strlen(sedBuf)+1, 0);
//关闭套接字
closesocket(clientSock);
}
//关闭服务端套接字
closesocket(serverSock);
//清理套接字库
WSACleanup();
system("pause");
return 0;
}
#2、Windows客户端
Windows客户端比服务端简单一些,步骤如下:
1、初始化套接字库
2、创建套接字
3、配置IP地址及端口号信息
4、发送请求连接服务端
5、传输数据
源代码如下:
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define CLIENT_ADDR "127.0.0.1" //127.0.0.1 表示本机IP地址 此处为服务端IP地址
//,如果服务端和客户端在同一电脑上 使用127.0.0.1就可以
#define CLIENT_PORT 8000
int main()
{
WSADATA wsaDate;
WORD wVersion = MAKEWORD(1, 1);
int err;
err = WSAStartup(wVersion, &wsaDate);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaDate.wVersion) != 1 || HIBYTE(wsaDate.wVersion) != 1)
{
WSACleanup();
return -1;
}
SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);
// 服务器的地址以及端口号信息
SOCKADDR_IN serverAddr;
serverAddr.sin_family = AF_INET;
// inet_addr 的作用是将字符串转换为地址
serverAddr.sin_addr.S_un.S_addr = inet_addr(CLIENT_ADDR);
serverAddr.sin_port = htons(CLIENT_PORT);
//连接到服务器
connect(clientSock, (SOCKADDR *)&serverAddr, sizeof(SOCKADDR));
char sedBuf[128] = "Hello,my client";
char revBuf[128];
send(clientSock, sedBuf, strlen(sedBuf)+1, 0);
std::cout << "send: " << sedBuf << '\n';
recv(clientSock, revBuf, sizeof(revBuf), 0);
std::cout << "received: " << revBuf << '\n';
closesocket(clientSock);
WSACleanup();
system("pause");
return 0;
}