MFC socket编程
新建两个基于对话框的工程,分别为sFile、cFile。在s端添加两个Edit:一个显示窗口IDC_EDIT1(点击右键选择Properties->Styles,选中Multiline,Vertical scroll、Read-only三项),一个输入窗口IDC_EDIT2。然后增加一个发送按钮:IDC_BtnSend。在c端添加三个Edit:一个显示窗口IDC_EDIT1(点击右键选择Properties->Styles,选中Multiline,Vertical scroll、Read-only三项),一个输入窗口IDC_EDIT2,一个IP地址输入窗口IDC_EDIT3。再增加两个按钮:一个发送按钮IDC_SEND,一个连接服务器按钮IDC_btnConnect。
服务器端具体步骤如下:
1、在StdAfx.h中添加 #include <afxsock.h> // MFC socket extensions
在Resource.h中添加#define IDP_SOCKETS_INIT_FAILED 103
在sFileDlg.h中添加public:void update(CString s);
在sFileDlg.h中添加private:
CEdit* show_edit;
CEdit* send_edit;
2、在sFileDlg.cpp中添加#include <winsock2.h>(加在#include "stdafx.h"之前)
#pragma comment(lib, "WS2_32.lib")
新建两个socket:SOCKET listen_sock;
SOCKET sock;
声明线程函数 UINT server_thd(LPVOID p);
3、在OnInitDialog()函数中添加:
show_edit = (CEdit *)GetDlgItem(IDC_EDIT1);
send_edit = (CEdit *)GetDlgItem(IDC_EDIT2);
send_edit->SetFocus();
char name[80];
CString IP;
hostent* pHost;
gethostname(name, 128);//获得主机名
pHost = gethostbyname(name);//获得主机结构
IP = inet_ntoa(*(in_addr *)pHost->h_addr);
update("本机IP地址:" + IP);
AfxBeginThread(&server_thd, 0);
添加函数update():
void CSFileDlg::update(CString s)
{
show_edit->ReplaceSel(s + "/r/n");
}
添加线程函数server_thd():
UINT server_thd(LPVOID p)
{
WSADATA wsaData;
WORD wVersion;
wVersion = MAKEWORD(2,2);
WSAStartup(wVersion,&wsaData);
// WSAStartup(0x0202, &wsaData);
SOCKADDR_IN local_addr;
SOCKADDR_IN client_addr;
int iaddrSize = sizeof(SOCKADDR_IN);
int res;
char msg[1024];
CSFileDlg * dlg = (CSFileDlg *)AfxGetApp()->GetMainWnd();
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(5150);
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if( (listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
{
dlg->update("创建监听失败");
}
if( bind(listen_sock, (struct sockaddr*) &local_addr, sizeof(SOCKADDR_IN)) )
{
dlg->update("绑定错误");
}
listen(listen_sock, 1);
if( (sock = accept(listen_sock, (struct sockaddr *)&client_addr, &iaddrSize)) == INVALID_SOCKET)
{
dlg->update("accept 失败");
}
else
{
CString port;
port.Format("%d", int(ntohs(client_addr.sin_port)));
dlg->update( "已连接来自:" + CString(inet_ntoa(client_addr.sin_addr)) + " 端口:" +
port);
}
接收数据
while(1)
{
if( (res = recv(sock, msg, 1024, 0)) == -1 )
{
dlg->update("失去连接");
break;
}
else
{
msg[res] = '\0';
dlg->update("client:" + CString(msg));
}
}
return 0;
}
4、添加按钮实现函数void CSFileDlg::OnBtnSend():
void CSFileDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
CString s;
char * msg;
send_edit->GetWindowText(s);
msg = s.GetBuffer(s.GetLength());
if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR)
{
show_edit->ReplaceSel("发送失败/r/n");
}
else if(s == "")
{
MessageBox("请输入信息");
}
else
{
show_edit->ReplaceSel("server:" + s + "/r/n");//消息上屏,清空输入,并重获焦点
send_edit->SetWindowText("");
send_edit->SetFocus();
}
}
5、在InitInstance()函数中添加:
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
客户端具体步骤如下:
1、在StdAfx.h中添加 #include <afxsock.h> // MFC socket extensions
在Resource.h中添加#define IDP_SOCKETS_INIT_FAILED 103
在sFileDlg.h中添加public:void update(CString s);
在sFileDlg.h中添加private:
CEdit* edit1;
CButton* btnconn;
CEdit* send_edit;
CEdit* ip_edit;
2、在sFileDlg.cpp中添加#include <winsock2.h>(加在#include "stdafx.h"之前)
#pragma comment(lib, "WS2_32.lib")
新建一个socket:SOCKET sock;
声明线程函数 UINT recv_thd(LPVOID p);
3、在OnInitDialog()函数中添加:
edit1 = (CEdit *)GetDlgItem(IDC_EDIT1);
send_edit = (CEdit *)GetDlgItem(IDC_EDIT2);
btnconn = (CButton *)GetDlgItem(IDC_btnConnect);
ip_edit = (CEdit *)GetDlgItem(IDC_EDIT3);
ip_edit->SetWindowText("127.0.0.1");
添加函数update():
void CCFileDlg::update(CString s)
{
edit1->ReplaceSel(s + "/r/n");
}
添加线程函数recv_thd():
UINT recv_thd(LPVOID p)
{
int res;
char msg[1024];
CString s;
CCFileDlg * dlg = (CCFileDlg *) AfxGetApp()->GetMainWnd();
dlg->update("in thd");
while(1)
{
if( (res = recv(sock, msg, 1024, 0)) == -1)
{
dlg->update("失去连接");
break;
}
else
{
msg[res] = '/0';
dlg->update("server:" + CString(msg));
}
}
//closesocket(sock);
return 0;
}
4、添加按钮实现函数void CCFileDlg::OnSend():
void CCFileDlg::OnSend()
{
// TODO: Add your control notification handler code here
CString s;
char * msg;
send_edit->GetWindowText(s);
msg = s.GetBuffer(s.GetLength());
if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR)
{
update("发送失败");
}
else if(s == "")
{
MessageBox("请输入信息");
}
else
{
update("client:" + s);//消息上屏,清空输入,并重获焦点
send_edit->SetWindowText("");
send_edit->SetFocus();
}
}
5、添加连接按钮实现函数OnConnect():
void CCFileDlg::OnConnect()
{
// TODO: Add your control notification handler code here
WSADATA wsaData;
SOCKADDR_IN server_addr;
WORD wVersion;
wVersion = MAKEWORD(2,2);
WSAStartup(wVersion,&wsaData);
// WSAStartup(0x0202, &wsaData);
CString ip;
ip_edit->GetWindowText(ip);//取得服务器的IP地址
server_addr.sin_addr.s_addr = inet_addr(ip);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5150);
if( (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
edit1->ReplaceSel("create socket error/r/n");
}
if( connect(sock, (struct sockaddr *) &server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
edit1->ReplaceSel("连接失败/r/n");
}
else
{
edit1->ReplaceSel("连接成功/r/n");
AfxBeginThread(&recv_thd, 0);
btnconn->EnableWindow(FALSE);//按钮变灰
}
}
6、在InitInstance()函数中添加:
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
MFC socket编程相关推荐
- 面试必备之:MFC socket编程(浅出+深度:服务端和客户端端口问题)
要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...
- MFC socket网络编程(流程示例)
MFC socket网络编程(流程示例) 1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! 服务器端程序: 1.加 ...
- MFC:Socket编程—TCP服务端和多个客户端通信
前言 MFC是微软基础类库,于 C++ 对于 C语言来说,MFC对于window API ,MFC 就相当于C++,window API 相当于C.MFC 封装了 window API 使用起来更加的 ...
- 基于TCP(面向连接)的Socket编程
基于TCP(面向连接)的Socket编程 一.客户端: 1.打开一个套接字(Socket); 2.发起连接请求(connect); 3.如果连接成功,则进行数据交换(read.write.send.r ...
- 揭开Socket编程的面纱
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 你 ...
- MFC 网络编程小结
最近对MFC的网络编程方面研究了一下..现在想对学习过程中的问题和一些想法做下总结. 1.现说下socket(套接字)吧,初学者刚看到这个东西的时候一定觉得很神秘,我也一样,现在也只是有一点皮毛的理解 ...
- Socket编程知识必学/SELECT 编程
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...
- Windows Socket和Linux Socket编程的区别
2019独角兽企业重金招聘Python工程师标准>>> 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2. ...
最新文章
- VS2017文件操作之使用fopen函数总结
- 量子计算101:浅谈其需求、前景和现实
- 丑数 Humble Numbers
- 转: 关于流量控制与令牌桶介绍
- Delphi格式化函数Format、FormatDateTime和FormatFloat详解
- 日期类型前后台传递格式控制注解@DateTimeFormat@JsonFormat@JSONField
- 关于python的多线程和多进程_Python的多线程和多进程
- 第12课:HA下的Spark集群工作机制解密
- Object类的用法(二)
- PyTorch 模型训练实用教程(附代码)
- jpa oracle 传参int类型判空_SQL查询:Oracle、mysql、HQL查询语句差异
- JavaScript 语言精粹 高清PDF中文版
- Java Map排序
- EPUB电子书阅读必备
- 今年的金德值得期待的人物_原水_新浪博客
- 《30天自制操作系统》学习笔记--第0天
- python爬取英雄联盟所有皮肤价格表_python 爬取英雄联盟皮肤并下载的示例
- syntax error:unterminated quoted string
- excel中以文本形式保存长数字
- Win10 Synaptics触摸板无法实现双指单击模拟鼠标右键点击的解决办法
热门文章
- 转 ajax.dll 与 ajaxpro.dll的用法
- Vue.js - Day4
- DiQuick Web UI 框架 V1.3.2 版本更新
- 基于 HTML5 WebGL 的 3D 机房
- Hirens Boot DVD 15.2 功能恢复版 v1.1 -- 制作U盘启动盘
- python读取数据库数据,读取出的中文乱码问题
- javascript中的cookie问题
- 一个我自己建的程序员资料分享站
- 【黑金动力社区】【BF531 体验板教程】 第二章 MS531介绍(二)
- 每日冲刺报告——Day2(Java-Team)