关键代码示例:
服务器端: // server.cpp : 实现文件 //
#define _CRT_SECURE_NO_WARNINGS
#include \ #include \通信实验.h\ #include \ #include \ #include
#pragma comment(lib,\) static int num = 0; // server 对话框
IMPLEMENT_DYNAMIC(server, CDialogEx)
server::server(CWnd* pParent /*=NULL*/) { }
server::~server() { }
void server::DoDataExchange(CDataExchange* pDX) { }
BEGIN_MESSAGE_MAP(server, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &server::OnBnClickedButton1) ON_WM_TIMER()
CDialogEx::DoDataExchange(pDX); : CDialogEx(IDD_DIALOG1, pParent)
END_MESSAGE_MAP() // server 消息处理程序
void server::OnBnClickedButton1() {
char sendBuf[100];//发送至客户端的字符串 char recvBuf[100];//接受客户端放回的字符串 // TODO: 在此添加控件通知处理程序代码 //SetTimer(1, 50000, NULL); int err;//错误信息 int len;
if (err != 0) { } /*
确认WinSock DLL支持2.2 */
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { }
//定义服务器端socket
sockServer = socket(AF_INET, SOCK_STREAM, 0); //设置服务器端socket
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//本机IP addrServer.sin_family = AF_INET; addrServer.sin_port = htons(6000); //将服务器socket绑定在本地端口
bind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR)); //Listen监听端口
listen(sockServer, 5);//5为等待连接数目 printf(\服务器已启动:\\n监听中...\\n\); len = sizeof(SOCKADDR);
//accept会阻塞进程,直到有客户端连接上来为止
sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len); //当客户端连接上来时,拼接字符串
sprintf(sendBuf, \欢迎 ip:%s 的用户连接,发送成功,欢迎使用\\n\,
//启动错误
WSACleanup();//终止WinSock 2 DLL的使用 return;
//启动错误,程序结束 return;
//配置Windows Socket版本
wVersinRequested = MAKEWORD(2, 2); //初始化Windows Socket
err = WSAStartup(wVersinRequested, &wsaData); WSADATA wsaData;//winsock结构体 WORD wVersinRequested;//winsock版本 SOCKET sockServer;//服务器端Socket SOCKADDR_IN addrServer;//服务器端地址 SOCKET sockClient;//客户端Socket SOCKADDR_IN addrClient;//客户端地址
inet_ntoa(addrClient.sin_addr)); }
//向客户端发送字符串
send(sockClient, sendBuf, strlen(sendBuf) + 1, 0); //获取客户端返回的数据
recv(sockClient, recvBuf, 100, 0); //打印客户端返回的数据 CString text; text = recvBuf;
SetDlgItemText(IDC_EDIT1, text); //关闭socket
closesocket(sockClient);
客户端:
#include
#pragma comment(lib, \) #include \ #include \通信实验.h\ #include \ #include \ // client 对话框
IMPLEMENT_DYNAMIC(client, CDialogEx) client::client(CWnd* pParent /*=NULL*/) { }
client::~client() { }
void client::DoDataExchange(CDataExchange* pDX) { }
CDialogEx::DoDataExchange(pDX); : CDialogEx(IDD_DIALOG2, pParent)
BEGIN_MESSAGE_MAP(client, CDialogEx)
// client 消息处理程序
void client::OnBnClickedButton1() {
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
// 启动错误,程序结束 WSACleanup(); if (err != 0) { }
return;
err = WSAStartup(wVersionRequested, &wsaData); wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; WORD wVersionRequested;
SOCKET sockClient; // 客户端 Scoket SOCKADDR_IN addrServer; // 服务端地址 int nLength = text.GetLength();
int nBytes = WideCharToMultiByte(CP_ACP, 0, text, nLength, NULL, 0, NULL, NULL); char* message = new char[nBytes + 1]; memset(message, 0, nLength + 1);
WideCharToMultiByte(CP_OEMCP, 0, text, nLength, message, nBytes, NULL, NULL); message[nBytes] = 0; int err;
char recvBuf[100];
// TODO: 在此添加控件通知处理程序代码 char* ip1 = \; char* ip2 = \; CString text;
GetDlgItemText(IDC_EDIT1, text);
ON_BN_CLICKED(IDC_BUTTON1, &client::OnBnClickedButton1) END_MESSAGE_MAP()
} }
return;
// 新建客户端 scoket
sockClient = socket(AF_INET, SOCK_STREAM, 0); // 定义要连接的服务端地址
addrServer.sin_addr.S_un.S_addr = inet_addr(ip1);// 目标IP (175.0.170.28是本机地址) addrServer.sin_family = AF_INET; // 协议类型是INET addrServer.sin_port = htons(6000);// 连接端口1234
// 让 sockClient 连接到 服务端
connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR)); // 发送数据到服务端
send(sockClient, message, strlen(message) + 1, 0); // 从服务端获取数据
recv(sockClient, recvBuf, 100, 0); // 打印数据 text = recvBuf;
SetDlgItemText(IDC_EDIT2, text); // 关闭socket
closesocket(sockClient); WSACleanup();
// 定义要连接的服务端地址二
addrServer.sin_addr.S_un.S_addr = inet_addr(ip2);// 目标IP addrServer.sin_family = AF_INET; // 协议类型是INET addrServer.sin_port = htons(6000);// 连接端口1234
// 让 sockClient 连接到 服务端
connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR)); // 发送数据到服务端
send(sockClient, message, strlen(message) + 1, 0); // 从服务端获取数据
recv(sockClient, recvBuf, 100, 0); // 打印数据 text = recvBuf;
SetDlgItemText(IDC_EDIT2, text); // 关闭socket
closesocket(sockClient); WSACleanup();
相关推荐: