1,通信
(1)身份:IP
(2)规则:协议
(3)分机:端口号
2,UDP,无需确认,实时性高.例如:视频会议,视频点播.
3,网络字节顺序: 网络高位先存.
intel:低位先存.
4,网间进程通信完全是异步的.
给出两个实例:(注意工程设置,需要加载库文件ws2_32.lib)
(1)基于TCP可靠连接的SOCKET.
服务器端:
#include <stdio.h>
#include <WINSOCK2.H>
int main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData; //记录套接字的详细信息
int err;
wVersionRequested = MAKEWORD( 1, 1 );//宏,返回版本号
err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库
//initiates use of the Winsock DLL by a process.
//成功返回0.
if ( err != 0 ) //表示有错误发生.
{
return 1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );//有加载,就要有对应的释放.
return 1;
}
SOCKET sockSvrver=socket(AF_INET,SOCK_STREAM,0);//创建套接字
if(sockSvrver==INVALID_SOCKET)
{
printf("套接字创建失败.");
return 1;
}
SOCKADDR_IN addServer; //定义地址结构体变量
addServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//u_long类型转换为网络字节序 htons u_short类型
addServer.sin_family=AF_INET;
addServer.sin_port=htons(6000);
int re_bind;
re_bind=bind(sockSvrver,(SOCKADDR*)&addServer,sizeof(SOCKADDR)); //绑定
if(re_bind==SOCKET_ERROR)
{
closesocket(sockSvrver);
printf("套接字绑定失败.");
return 1;
}
listen(sockSvrver,5);//等待队列的最大成员数
SOCKADDR_IN addrClient; //接受变量
int len=sizeof(SOCKADDR);//接收变量的长度
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
SOCKET sockConnect=accept(sockSvrver,(SOCKADDR*)&addrClient,&len);
while(1)
{
recv(sockConnect,recvBuf,100,0);
sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
if('q'==recvBuf[0])//表示客户端想要退出
{
send(sockConnect,"q",strlen("q")+1,0);
printf("Chat end!\n");
break;
}
printf("Please input data:\n");
gets(sendBuf);//可以得到一行数据
send(sockConnect,sendBuf,strlen(sendBuf)+1,0);
}
closesocket(sockConnect); //关闭套接字
WSACleanup();
//如果不是死循环,需要关闭监听套接字
//并调用WSACleanup()关闭套接字库
return 0;
}
客户端:
#include <stdio.h>
#include <WINSOCK2.H>
int main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData; //记录套接字的详细信息
int err;
wVersionRequested = MAKEWORD( 1, 1 );//宏,返回版本号
err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库
//initiates use of the Winsock DLL by a process.
//成功返回0.
if ( err != 0 ) //表示有错误发生.
{
return 1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );//有加载,就要有对应的释放.
return 1;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//本地环路地址
addrServer.sin_port=htons(6000);
addrServer.sin_family=AF_INET;
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
while(1)
{
printf("Please input data:\n");
gets(sendBuf);//可以得到一行数据
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
recv(sockClient,recvBuf,100,0);
sprintf(tempBuf,"server say: %s",recvBuf);
printf("%s\n",tempBuf);
if('q'==recvBuf[0])//表示客户端想要退出
{
send(sockClient,"q",strlen("q")+1,0);
printf("Chat end!\n");
break;
}
}
//5.终止对套接字库的使用
closesocket(sockClient); //关闭套接字
WSACleanup();
return 0;
}
(2)基于UDP连接的SOCKET.
服务器端:
//编写一个基于UDP的聊天工具
//发送端代码
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
//2.创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind (sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if('q'==recvBuf[0])//表示客户端想要退出
{
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
printf("Please input data:\n");
gets(sendBuf);//可以得到一行数据
sendto (sockSrv,sendBuf,strlen(sendBuf)+1,0,
(SOCKADDR*)&addrClient,len);//发送数据
}
closesocket(sockSrv);
WSACleanup();
}
客户端:
//发送端代码
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
//2.创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
//3.发送消息
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
char recvBuf[100];
char sendBuf[100];
char tempBuf[200];
int len = sizeof(SOCKADDR);
while (1)
{
printf("Please input data:\n");
gets(sendBuf);
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*) &addrSrv,&len);
if('q' ==recvBuf[0])
{
sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*) &addrSrv,len);
printf("chat end!\n");
break;
}
sprintf(tempBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s\n",tempBuf);
}
closesocket(sockClient);
WSACleanup();
}
分享到:
相关推荐
【基于MFC的UDP网络编程】是针对Visual Studio 2010环境下,利用Microsoft Foundation Classes(MFC)库进行的用户数据报协议(UDP)的网络编程实践。MFC是微软提供的一种C++类库,它封装了Windows API,使得开发者...
而Socket编程是网络通信的基础,MFC对Socket编程提供了封装,使得开发者能够在MFC环境下更方便地进行网络通信程序的开发。本知识点将详细解析如何使用MFC进行Socket网络编程,以创建一个服务器/客户端应用程序。 ##...
在这个"基于MFC的OpenGL编程"主题中,我们将探讨如何在MFC应用中集成OpenGL,以及如何解决拖动时产生的图像抖动问题。 首先,我们需要理解MFC中的单文档视图框架(SDI,Single Document Interface)。SDI允许用户...
在IT领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。MFC封装了许多Windows API,使得...理解并熟练掌握这些知识点,对于提升在C++环境下进行网络编程的能力非常有帮助。
【基于MFC的网络聊天室】是一个利用C++编程语言,并基于Microsoft Foundation Classes (MFC)库构建的网络通信应用。MFC是微软提供的一套面向对象的C++类库,它封装了Windows API,使得开发者能更方便地创建Windows...
基于MFC界面编程的五子棋程序 本资源是一个使用MFC(Microsoft Foundation Classes)编写的简易五子棋程序,代码不复杂,简单容易执行。下面是从代码中提取的相关知识点: MFC编程 MFC(Microsoft Foundation ...
总的来说,基于MFC的游戏编程结合了面向对象编程、Windows API调用和图形用户界面设计,需要对C++、Windows编程以及MFC框架有深入的理解。通过学习和实践,你可以掌握如何利用MFC开发出功能丰富的棋类游戏,例如象棋...
【标题】:“基于MFC编程,邮件收发软件” 在计算机科学领域,MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的类库,它为Windows应用程序开发提供了丰富的功能和接口。MFC编程主要是利用C++语言...
本教程"基于MFC的OpenGL编程Part10源码"显然是一个系列教程的一部分,旨在帮助程序员理解如何在MFC应用程序中嵌入和使用OpenGL进行3D图形渲染。 MFC是微软提供的一套面向对象的C++类库,用于构建Windows应用程序。...
以下是对"基于MFC的SQL编程全例"这一主题的详细讲解: 1. MFC与数据库连接: MFC提供了CDaoDatabase和CDaoRecordset类来支持数据库操作。CDaoDatabase用于建立和管理数据库连接,而CDaoRecordset则用于执行查询并...
在MFC编程基础知识中,以下几个关键知识点是初学者必须掌握的: 1. **基础类结构**:MFC的核心类包括CWinApp、CWinThread、CWnd、CDocument和CView。CWinApp是应用程序的入口点,负责初始化和管理应用程序;...
在这个项目中,“MFC.zip_MFC 五子棋_MFC网络五子棋_mfc网络编程_网络五子棋_网络编程”显然是一款基于MFC技术开发的网络五子棋游戏。本文将深入探讨如何利用MFC进行网络编程,以及在设计网络五子棋游戏时所涉及的...
通过以上这些知识点的学习和实践,开发者可以掌握利用MFC进行网络编程的基本方法,并能成功地构建一个网络五子棋游戏。这个过程不仅锻炼了编程技巧,也深化了对网络通信和多线程编程的理解。在实际开发中,不断优化...
在"基于MFC的DirectX编程框架"中,通常会包含以下几个关键知识点: 1. **MFC与DirectX的集成**: - MFC的CWnd派生类:DirectX的初始化工作被封装在一个CWnd的派生类中。这是因为CWnd是MFC中的基本窗口类,它代表...
### 基于MFC的OpenGL编程:详细解析与实践指南 #### 一、概述 在计算机图形学领域,OpenGL(Open Graphics Library)是一种广泛使用的跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。而...
基于MFC的OpenGL编程结合了这两种技术,使得开发者可以在Windows环境下方便地利用OpenGL的强大功能。 在"基于MFC的OpenGL编程part6源码"中,我们可以期待学习以下几个关键知识点: 1. **OpenGL窗口创建**:MFC提供...
以上就是基于MFC的简单编程实现,通过对话框收集姓名和年龄信息,然后利用ADO存入数据库的基本步骤。对于初学者来说,这是一个很好的起点,可以帮助理解和掌握MFC及数据库操作的基础知识。随着对MFC和ADO的深入学习...
在Microsoft Foundation Classes (MFC) 中进行Socket编程,主要是为了构建基于Windows的网络应用程序,使得它们能够通过Internet或局域网进行通信。MFC提供了一种面向对象的方式来封装Windows的Socket API,使得...
在这个基于MFC(Microsoft Foundation Classes)的聊天程序源代码中,我们可以深入学习到如何利用Socket接口在Windows环境下进行网络聊天应用的开发。MFC是微软提供的一个C++类库,它封装了Windows API,使得开发者...
总结起来,"基于MFC的简单网络聊天室"是一个很好的实践项目,它涵盖了MFC的基础知识、网络编程的基本概念以及面向对象编程的实践。对于想要学习MFC和网络编程的初学者,这是一个很好的起点,通过分析和运行这个项目...