Socket 学习之 MFC:简单通信
最终界面如图:
代码如下:
原工程文件可以下载我上传的资源文件VS2013可以直接运行,其他版本清理生成文件后在运行,不懂得可以问。
附上链接:https://download.****.net/my
服务器端::
//开启服务器按钮响应事件
void CsFileDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
WSADATA wsData;
WSAStartup(MAKEWORD(2,2), &wsData);
char name[80];
CString IP;
CString P;
hostent* pHost;
gethostname(name,sizeof(name));//获得主机名
pHost = gethostbyname(name);//获得主机结构
IP = inet_ntoa(*(struct in_addr *)pHost->h_addr_list[0]);//获取主机ip地址
showmsg_edit->SetWindowText("绑定IP地址:" + IP);
AfxBeginThread(&server_thd,this); //开启新线程处理
}
//发送消息按钮处理事件
void CcFileDlg::OnBnClickedSend()
{
CString s;
char * msg;
send_edit->GetWindowText(s);
msg = (char*)s.GetBuffer(s.GetLength()); //获取发送的数据的缓冲区的指针
if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR) //判断发送是否成功
{
update("发送失败\r\n");
}
else if(s == "") //判断发送的数据是否为空
{
MessageBox("请输入信息");
}
else
{
update("我:"+ s+"\r\n");//消息上屏
send_edit->SetWindowText("");//清空输入
send_edit->SetFocus(); //重获焦点
}
}
客户端::
//链接,点连接按钮执行事件
void CcFileDlg::OnBnClickedbtnconnect()
{
// TODO: 在此添加控件通知处理程序代码
WSADATA wsaData;
SOCKADDR_IN server_addr;
WORD wVersion;
wVersion = MAKEWORD(2,2);
WSAStartup(wVersion,&wsaData);//使用Socket的程序在使用Socket之前必须调用WSAStartup函数。
//该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;
//操作系统利用第二个参数返回请求的Socket的版本信息。
//当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,
//然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
//该函数执行成功后返回0
CString ip;
CString port;
ip_edit->GetWindowText(ip);//取得服务器的IP地址
port_edit->GetWindowText(port);//取得服务器的端口
if(port=="") //判断端口是否为空
{
AfxMessageBox("请输入端口号");
btnconn->EnableWindow(TRUE);
return;
}
//为server_addr赋值 ,创建soket
server_addr.sin_addr.s_addr = inet_addr((LPCSTR)ip);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(port));
if( (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) //判断soket是否创建成功
{
update("创建Soket错误!\r\n");
btnconn->EnableWindow(TRUE);
return;
}
if( connect(sock, (struct sockaddr *) &server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)//判断链接是否成功
{
update("连接失败\r\n");
btnconn->EnableWindow(TRUE);
return;
}
else
{
update("连接成功\r\n");
AfxBeginThread(&recv_thd, this); //开启线程处理
btnconn->EnableWindow(FALSE);//连接按钮变灰
}
}
//发送消息按钮处理事件
void CcFileDlg::OnBnClickedSend()
{
CString s;
char * msg;
send_edit->GetWindowText(s);
msg = (char*)s.GetBuffer(s.GetLength()); //获取发送的数据的缓冲区的指针
if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR) //判断发送是否成功
{
update("发送失败\r\n");
}
else if(s == "") //判断发送的数据是否为空
{
MessageBox("请输入信息");
}
else
{
update("我:"+ s+"\r\n");//消息上屏
send_edit->SetWindowText("");//清空输入
send_edit->SetFocus(); //重获焦点
}
}