大家好,关于windows网络编程很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于windows网络编程基础教程的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
在网络技术飞速发展的今天,Windows网络编程成为了计算机领域的一个热门话题。本文将从基础知识、常用协议、编程实践等方面,深入浅出地介绍Windows网络编程的相关内容,帮助大家更好地理解和掌握这项技术。
一、基础知识
1. 网络协议
网络协议是计算机网络中进行数据交换的规则,是网络通信的基础。常见的网络协议有TCP/IP、HTTP、FTP、SMTP等。下面简单介绍几个常用的网络协议:
- TCP/IP:传输控制协议/互联网协议,是互联网中最基本的协议,负责数据包的传输。
- HTTP:超文本传输协议,用于在Web服务器和客户端之间传输超文本信息。
- FTP:文件传输协议,用于在客户端和服务器之间传输文件。
- SMTP:简单邮件传输协议,用于发送电子邮件。
2. IP地址和端口号
IP地址是网络中设备的唯一标识,分为公网IP和私网IP。端口号是应用程序在通信过程中的唯一标识,用于区分不同的应用程序。
二、常用协议
1. TCP协议
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它提供了数据的有序、无差错、无重复的传输。
| 特性 | 说明 |
|---|---|
| 面向连接 | 建立连接前需要握手,确保双方可以通信 |
| 可靠性 | 数据传输过程中,会检测错误并进行重传 |
| 有序 | 数据传输过程中,会按照发送顺序传输 |
| 流量控制 | 避免网络拥塞,控制数据传输速率 |
2. UDP协议
UDP(用户数据报协议)是一种无连接的、不可靠的、基于数据报的传输层通信协议。它适用于对实时性要求较高的应用,如视频、音频等。
| 特性 | 说明 |
|---|---|
| 无连接 | 不需要建立连接,直接发送数据 |
| 不可靠 | 数据传输过程中,可能会丢失、重复 |
| 无序 | 数据传输过程中,可能会乱序 |
| 低延迟 | 数据传输速度较快 |
三、编程实践
1. C++网络编程
C++是Windows网络编程中最常用的编程语言之一。以下是一个简单的TCP客户端示例:
“`cpp
include
pragma comment(lib, “
怎样学习Windows 网络编程
新手必学:windows网络编程经典入门
作者:huyoo
对于一个windows网络编程初学者,下面方法是经典入门。
初学者建议不要用MFC提供的类,而用windows API做一个简单服务器和客户端,这样有助于对socket编程机制的理解。
为了简单起见,应用程序是基于MFC的标准对话框。
Winsock用WINDOWS API实现:
(1)服务器端有两个线程:
主线程—你需要编写以下函数来实现
#define NETWORK_EVENT USER_MESSAGE+100 file://定义网络事件
sockaddr_in clientaddr; file://暂时存放客户端IP地址
file://自己定义消息映射函数,将上面定义的网络事件映射到处理函数
为网络事件处理函数,它在下面定义
ON_MESSAGE(NETWORK_EVENT, OnNetEvent);
在你对话框中的初始化函数中调用下面的初始化网络的子函数
BOOL InitNetwork() file://初始化网络
{
file://初始化TCP协议
BOOL ret= WSAStartup(MAKEWORD(2,2),&wsaData);
if(ret!= 0)
{
MessageBox(“初始化套接字失败!”);
return FALSE;
}
file://创建服务器端套接字
SOCKET serverSocket
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serverSocket== INVALID_SOCKET)
{
MessageBox(“创建套接字失败!”);
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
file://绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family= AF_INET;
localaddr.sin_port= htons(1688);
localaddr.sin_addr.s_addr= 0;
if(bind(serverSocket,(const struct sockaddr*)&localaddr,
sizeof(sockaddr))== SOCKET_ERROR)
{
MessageBox(“绑定地址失败!”);
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
file://注册网络异步事件,m_hWnd为应用程序的主对话框或主窗口的句柄
WSAAsyncSelect(serverSocket, m_hWnd, NETWORK_EVENT,
FD_ACCEPT| FD_CLOSE| FD_READ| FD_WRITE);
listen(serverSocket, 5); file://设置侦听模式
return TRUE;
}
file://定义网络事件的响应函数
void OnNetEvent(WPARAM wParam, LPARAM lParam)
{
file://调用API函数,得到网络事件类型
int iEvent= WSAGETSELECTEVENT(lParam);
file://得到发出此事件的客户端套接字
SOCKET pSock=(SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: file://客户端连接请求
{
OnAccept();
break;
}
case FD_CLOSE: file://客户端断开事件:
{
OnClose(pSock);
break;
}
case FD_READ: file://网络数据包到达事件
{
OnReceive(pSock);
break;
}
case FD_WRITE: file://发送网络数据事件
{
OnSend(pSock);
break;
}
default: break;
}
}
void OnAccept(SOCET pSock) file://响应客户端连接请求函数
{
int len= sizeof(sockaddr);
file://调用API函数,接受连接,并返回一个新套接字
file://还可以获得客户端的IP地址
SOCKET clientSocket= accept(serverSocket,
(struct sockaddr*)&clientaddr,&len);
file://为新的socket注册异步事件,注意没有Accept事件
if(WSAAsyncSelect(clientSocket,m_hWnd, IP_EVENT,
FD_CLOSE| FD_READ| FD_WRITE)== SOCKET_ERROR)
{
MessageBox(“注册异步事件失败!”);
return;
}
file://自编函数,将此客户端的相关信息保存下来:套接字、
// IP地址、登陆时间
saveClientSocket(clientSocket,clientAddr,currentTimer);
}
void OnClose(SOCET pSock)
{
file://自编函数,结束与相应的客户端的通信,释放相应资源并做相应处理
endClientSocket(pSock);
}
void OnSend(SOCET pSock)
{
file://自编函数,在给客户端发数据时做一些预处理
handleOnSend(pSock);
}
void OnReceive(SOCET pSock)
{
recv(…); file://调用API函数,读出网络缓冲区中的数据包
file://自编函数,将此数据包和发出此数据的客户端
封装成一条网络消息
buildNetMsg(…);
file://自编函数,将此网络消息放入一个消息队列中,由工作线程去处理
saveNetMsg(…);
SetEvent(…); file://用事件对象触发工作线程
}
客户端登陆后,随即把自己的计算机名发给服务器,服务器接到后,把它保存下来。这样服务器就可以显示所有在线客户端的信息了,包括:客户端计算机名、IP地址、登陆时间等。
注意:客户端没有OnAccept()函数,但有OnConnect()函数。
工作线程—
在你的应用程序初始化时,创建并启动一个工作线程
AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL);
可能为应用程序的主对话框或主窗口的句柄
UINT WorkThread(LPVOID pParam)
{
while(1)
{
file://等待多重事件到来
int ret= WaitForMultipleObject(…);
switch(ret)
{
case OBJECT_0:
{
if(bNewNetMsg) file://查看网络消息队列是否有新的网络消息
{
readNetMsg(…); file://如有新的网络消息,则读出
handleNetMsg(…); file://处理此网络消息
}
break;
}
case OBJECT_0+ 1:
{
file://做退出处理
break;
}
default: break;
}
return 0;
}
客户端为单线程,登陆服务器时,用connect()函数给服务器发连接请求;
客户端没有OnAccept()函数,但有OnConnect()函数。
在OnConnect()函数里做发连接请求时的预处理;
在OnReceive()函数里响应并处理网络数据;
在OnClose()函数里响应服务器的关闭事件;
在OnSend()函数里做发数据时的预处理;
如果你还想实现各客户端之间的在线交流(即所谓的聊天室),你在客户端还可以基于UDP协议
再做一套多点对多点的局域网组播模型模型,以后在和你聊,你先把上面的程序实现。
以上的I/O异步模型基于Windows的消息机制,另外还可以用事件模型、重叠模型或完成端口模型,
建议你参考Windows网络编程指南之类的书。
如果你能对上面的机制很熟练,你肯定已经对Winsock编网络程序的机制有一定理解,接下来你可以进行更精彩的编程,不仅可以在网上传输普通数据,而且还
以传输语音、视频数据,你还可以自己做一个聊天室,和你的同学在实验室的局域网里可以共同分享你的成果。
c程序如何在windows下进行网络编程
和编译(OR IDE)环境有关,比如vc就可以直接使用所有c的库函数.
ftp使用TCP,那么就用流式套接字(SOCK_STREAM)的相关函数,如果作为客户端,调用顺序如下:
1 socket()
2 connect()
3 send/recv
4 closesocket()
如果是服务器端,调用顺序如下:
1 socket()
2 bind()
3 listen()
4 accept()
5 send/recv()
6 closesocket()
vc下有库ws2_32.lib可供使用
程序只能在传输层进行开发(既TCP/UDP),不可以在应用层进行操作,即没有这样的库,调用它一个函数就实现了ftp的客户端或服务器端。如果需要可以参照网上的ftp代码。
使用如上库很简单:
#include<winsock2.h>
#pragma comment(lib,”ws2_32.lib”)
…
详见msdn
Windows网络编程技术的目录
第1章 Windows网络编程基础
1.1 Windows网络应用
1.1.1常用的网络应用实例
1.1.2网络应用的特点与运行环境
1.1.3网络应用前景
1.2 Windows环境下的应用程序
1.2.1应用程序的形态
1.2.2应用程序的运行环境
1.2.3应用程序的开发环境VC++
1.3 Windows环境下的网络应用程序
1.3.1网络应用程序的系统支持
1.3.2网络应用程序运行环境的问题
1.3.3网络应用程序的应用模型
第2章单机资源共享的应用编程
2.1进程间通信
2.1.1进程间通信应用实例及概念
2.1.2进程的创建与终止
2.1.3内存文件映射
2.2多线程通信
2.2.1多线程应用实例及概念
2.2.2线程的创建、挂起、激活和终止
2.2.3线程的优先级
2.3同步控制机制
2.3.1同步控制应用实例及意义
2.3.2同步控制类型及应用条件
2.3.3应用实例的算法与实现
2.4动态链接库
2.4.1静态链接库与动态链接库的应用实例
2.4.2动态链接库的创建与调用方法
2.4.3动态链接库的应用的条件
第3章基于NetBIOS的网络编程
3.1基于NetBIOS的网络编程基础
3.1.1网络应用实例与来源
3.1.2 NetBIOS提供的接口与服务
3.1.3网络控制块NCB的应用
3.2数据报通信编程
3.2.1数据报通信应用模型
3.2.2实例中的广播式数据报通信算法与实现
3.2.3实例中定向型数据报通信的算法与实现
3.3会话通信编程
3.3.1会话通信应用模型
3.3.2实例中会话服务器的算法与实现
3.3.3实例中的会话客户算法与实现
第4章基于WinSock的网络编程
4.1基于WinSock网络编程的基础
4.1.1网络应用实例与来源
4.1.2 Winsock提供的接口与服务
4.1.3 WinSock提供的函数调用
4.2 WinSock网络应用实例算法与实现
4.2.1获取主机网络信息
4.2.2 WinSock单播、多播与广播通信应用
4.2.3 WinSock会话通信应用
4.3 WinSock异步I/O
4.3.1 WinSock异步I/O应用实例
4.3.2 WinSock的I/O方法
4.3.3异步I/O应用实例的算法与实现
第5章直接网络编程
5.1原始套接字编程
5.1.1原始套接字简介
5.1.2 WinSock的原始套接字
5.1.3 Winsock原始套接字编程步骤
5.1.4 Winsock原始套接字实例
5.2基于winPcap网络数据包捕获
5.2.1 WinPcap简介
5.2.2网络数据包捕获的原理
5.2.3 Windlows捕获数据包的结构
5.2.4利用WinPcap进行网络数据包的捕获和过滤的设计步骤
5.2.5 WinPcap开发环境配置
5.2.6 WinPcap实例分析
5.2.7数据包捕获性能的优化
第6章高级网络编程
6.1简单MFC网络编程
6.1.1网络聊天应用实例
6.1.2 MFC基本框架与接口
6.1.3网络应用实例的实现
6.2基于MFC Socket类编程
6.2.1 CAsyncSocket类和CSocket类
6.2.2网络应用实例功能介绍
6.2.3网络应用实例算法及实现
6.3 MFC WinInet编程
6.3.1 WinInet API编程
6.3.2 winInet类的编程模型
6.3.3 HTTP网络应用实例算法及实现
附录1网络、应用程序开发说明
附1.1网络体系结构的概念
附1.2可执行文件的PE格式
附1.3 VC++的项目向导类型和文件类型
附1.4 Win32系统调用
附录2部分Win32函数定义
附录3 NetBIOS的NCB结构、命令和错误代码
附3.1网络控制块NCB的结构
附3.2 NCB ncb—command字段的命令代码
附3.3 NetBIOS错误代码
附录4 WinSoek数据结构、库函数和错误代码
附4.1 Winsockk数据结构
附4.2 Winsock基本套接字函数
附4.3 Winsock的扩展函数
附4.4 Winsockk错误代码
附录5 WinPcap定义、库函数
附5.1定义
附5.2函数
……
关于windows网络编程到此分享完毕,希望能帮助到您。




