21xrx.com
2025-04-02 13:15:04 Wednesday
文章检索 我的文章 写文章
Visual C++网络编程案例实战
2023-07-13 09:31:16 深夜i     4     0
Visual C++ 网络编程 案例实战 TCP/IP socket编程

Visual C++是一款广泛使用的编程环境,它提供了丰富的编程工具和组件,支持开发多种类型的应用程序。其中,网络编程是Visual C++的重要应用之一。本文将介绍一些Visual C++网络编程案例实战,帮助读者更好地了解和使用Visual C++网络编程。

1.基础的Socket编程

Socket编程是网络编程的基础,也是最常用的一种网络编程方法。Visual C++提供了丰富的Socket编程接口和类库,可以很方便地实现网络通信功能。我们来看一下一个简单的Socket编程例子:

//Client端代码
#include <WinSock2.h>
#include <iostream>
using namespace std;
int main()
{
  //初始化Winsock库
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //创建Socket
  SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  //连接服务器
  sockaddr_in serverAddr;
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  serverAddr.sin_port = htons(8888);
  connect(clientSocket, (sockaddr*)& serverAddr, sizeof(serverAddr));
  //发送数据
  char sendData[1024] = "Hello, Server!";
  send(clientSocket, sendData, strlen(sendData) + 1, 0);
  //关闭Socket
  closesocket(clientSocket);
  WSACleanup();
  return 0;
}
//Server端代码
#include <WinSock2.h>
#include <iostream>
using namespace std;
int main()
{
  //初始化Winsock库
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //创建Socket
  SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  //绑定地址及端口号
  sockaddr_in serverAddr;
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_addr.s_addr = INADDR_ANY;
  serverAddr.sin_port = htons(8888);
  bind(serverSocket, (sockaddr*)& serverAddr, sizeof(serverAddr));
  //监听连接请求
  listen(serverSocket, 5);
  //接受客户端连接
  SOCKET clientSocket;
  sockaddr_in clientAddr;
  int clientAddrLen = sizeof(clientAddr);
  clientSocket = accept(serverSocket, (sockaddr*)& clientAddr, &clientAddrLen);
  //接收数据
  char recvData[1024] = {0};
  recv(clientSocket, recvData, 1024, 0);
  cout << "Recv Data: " << recvData << endl;
  //关闭Socket
  closesocket(clientSocket);
  closesocket(serverSocket);
  WSACleanup();
  return 0;
}

这个例子展示了客户端和服务器之间的简单通信过程。客户端向服务器发送一条消息,“Hello, Server!”,服务器接收这条消息并打印出来。

2.使用HTTP和FTP协议

HTTP和FTP协议是应用最广泛的网络协议之一。Visual C++同样提供了相应的类库,可以很容易地实现使用这些协议来进行网络通信。下面是一个使用HTTP协议实现GET请求的例子:

//使用HTTP协议实现GET请求
#include <WinInet.h>
#include <iostream>
using namespace std;
int main()
{
  HINTERNET hOpen = InternetOpenA("WinInet Test Program", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  HINTERNET hConnect = InternetConnectA(hOpen, "www.baidu.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
  HINTERNET hRequest = HttpOpenRequestA(hConnect, "GET", "/", NULL, NULL, NULL, 0, 1);
  HttpSendRequestA(hRequest, NULL, 0, NULL, 0);
  char buffer[1024] = {0};
  DWORD bufferSize;
  HttpQueryInfoA(hRequest, HTTP_QUERY_STATUS_CODE, buffer, &bufferSize, 0);
  cout << "HTTP Status Code: " << buffer << endl;
  HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, buffer, &bufferSize, 0);
  cout << "Content Type: " << buffer << endl;
  while (InternetReadFile(hRequest, buffer, sizeof(buffer)-1, &bufferSize) && bufferSize > 0)
  {
    buffer[bufferSize] = 0;
    cout << buffer;
  }
  InternetCloseHandle(hRequest);
  InternetCloseHandle(hConnect);
  InternetCloseHandle(hOpen);
  return 0;
}

这个例子展示了使用HTTP协议发送GET请求,并返回服务器的响应结果。

3.使用SMTP协议发送邮件

SMTP协议是发送邮件的主要协议之一,Visual C++也提供了相应的类库,可以方便地实现SMTP协议的邮件发送。下面是一个使用SMTP协议发送邮件的例子:

//使用SMTP协议发送邮件
#include <WinSock2.h>
#include <iostream>
using namespace std;
#define SMTPSERVER "smtp.163.com"
#define SMTPPORT 25
#define SMTPFROM "myemail@163.com"
#define SMTPPWD "mypassword"
int SendMail(SOCKET s, char* buf)
{
  char recvBuf[1024];
  int ret = recv(s, recvBuf, sizeof(recvBuf), 0);
  recvBuf[ret] = '\0';
  cout << recvBuf;
  ret = send(s, buf, strlen(buf), 0);
  cout << buf;
  ret = recv(s, recvBuf, sizeof(recvBuf), 0);
  recvBuf[ret] = '\0';
  cout << recvBuf;
  return ret;
}
int main()
{
  //初始化Winsock库
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //连接SMTP服务器
  SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  sockaddr_in sockAddr;
  sockAddr.sin_family = AF_INET;
  sockAddr.sin_addr.s_addr = inet_addr(SMTPSERVER);
  sockAddr.sin_port = htons(SMTPPORT);
  connect(sock, (sockaddr*)& sockAddr, sizeof(sockAddr));
  //发送SMTP命令
  char buf[1024];
  SendMail(sock, "HELO smtp.163.com\r\n");
  sprintf_s(buf, "AUTH LOGIN\r\n");
  SendMail(sock, buf);
  sprintf_s(buf, "%s\r\n", SMTPFROM);
  SendMail(sock, buf);
  sprintf_s(buf, "%s\r\n", SMTPPWD);
  SendMail(sock, buf);
  sprintf_s(buf, "MAIL FROM:<%s>\r\n", SMTPFROM);
  SendMail(sock, buf);
  sprintf_s(buf, "RCPT TO:<recipient@163.com>\r\n");
  SendMail(sock, buf);
  sprintf_s(buf, "DATA\r\n");
  SendMail(sock, buf);
  sprintf_s(buf, "Subject: Test Mail\r\n"
    "To: <recipient@163.com>\r\n"
    "From: MyEmail<%s>\r\n\r\n"
    "Test Content Here!\r\n.\r\n", SMTPFROM);
  SendMail(sock, buf);
  sprintf_s(buf, "QUIT\r\n");
  SendMail(sock, buf);
  //关闭Socket
  closesocket(sock);
  WSACleanup();
  return 0;
}

这个例子展示了使用SMTP协议发送邮件的过程。程序需要连接SMTP服务器,通过发送SMTP命令,实现身份认证、发件人收件人设置、邮件内容设置等步骤。最终,成功发送一封测试邮件。

总结

本文简单介绍了Visual C++网络编程中基础的Socket编程、HTTP和FTP协议的应用和SMTP协议的邮件发送,这些网络编程技术都是非常实用的。网络编程技术是现代应用开发不可或缺的一部分,希望本文可以帮助读者更好地了解和使用Visual C++网络编程技术。

  
  

评论区