如何学习网络编程,第1张

具体到编程,用java来实现网络编程是很容易的,可以作为网络编程的入门。使用C++和winsock相对复杂一些。总之看实际需要了。 你好初学网络编程者可以从以下几个步骤开展:1)下载一个可以互动的学习工具,通过这个与这个工具互动,我们可以及时的学到每个api的结果如果。我个人强烈推荐一个互动好工具,即python,下载地址

对于有c/c++或java基础的朋友通过一两个礼拜的时间就可以上手了,另外个人建议初学者可以学习dive into python。2)掌握网络编程中会用到的几个基本概念和内涵,比如IP地址,port号,socket等3)记住和消化网络编程C/S模型,把server和client端编程的常用模式理解和消化4)花几天时间学习socket api集,api集可以分为下面几大类:创建 socket bind listen accept收发 read/recv/recvfrom write/send/sendto关闭 close shutdown参数 getsockopt/setsockopt地址 gethostbyaddr getaddrbyhost,在学习这些api时候,可以先关注在函数功能,参数意义上5)结合python互动平台,实践socket api的用法,比如socket函数怎么使用,bind怎么使用等等。在互动过程中,我们可以变换参数,看看调用结果如何。比如,创建一个tcp socket的语法如下:socket(AF_INET,SOCK_STREAM)创建一个udp socket的语法如下:socket(AF_INET,SOCK_DGRAM)6)学习socket server端编程实现简单规约比如echo,time等,然后通过cmd中的telnet来测试。7)学习I/O模型,比如阻塞、非阻塞和反应式(select,poll,WaitForMultipleObject)等8)学习Richard Stevens的《Unix网络编程》,深入学习其中的api原理以及服务端设计原理,并通过代码编写。9)下载高性能网络编程框架twisted,笔者强烈推荐,它将使你的网络编程效率提高10倍以上。10)学习设计模式、操作系统知识比如线程、进程、同步等。邻家阿呆 回答采纳率:290% 2008-12-18 09:55检举我是高手,我可以教你1明确学习目的学习编程对大多数IT业人员来说都是非常有用的。学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序员永远是被争夺的对象。学习编程还能 锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿,因为程序设计本身是一种创造性的工作。知识经济时代给我们带来了无限的机会,要想真正掌握计算机技术,并在IT行业里干出一番事业来,有所作为,具有一定的编程能力是一个基本条件和要求。2打好基础学编程要具备一定的基础,总结之有以下几方面:(1)数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了。(2)逻辑思维能力的培养 学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。谁都有第一次。有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。

先给除服务端代码:

#include <stdioh>

#include <Winsock2h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

/ Tell the user that we could not find a usable /

/ WinSock DLL /

return;

}

/ Confirm that the WinSock DLL supports 22/

/ Note that if the DLL supports versions greater /

/ than 22 in addition to 22, it will still return /

/ 22 in wVersion since that is the version we /

/ requested /

if ( LOBYTE( wsaDatawVersion ) != 2 ||

HIBYTE( wsaDatawVersion ) != 2 ) {

/ Tell the user that we could not find a usable /

/ WinSock DLL /

WSACleanup( );

return;

}

SOCKET sockSrv=socket(AF_INET, SOCK_DGRAM, 0);

SOCKADDR_IN addrSrv;

addrSrvsin_family=AF_INET;

addrSrvsin_port=htons(5050);

addrSrvsin_addrS_unS_addr=htonl(INADDR_ANY);

bind(sockSrv,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));

char recvBuf[200];

char sendBuf[200];

char Buf[400];

SOCKADDR_IN addrCli;

int len = sizeof(SOCKADDR);

int a=1;

for(;;)

{

recvfrom(sockSrv,recvBuf,200,0,(SOCKADDR)&addrCli,&len);

if('q'==recvBuf[0])

{

sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR)&addrCli,len);

printf("chat over !");

break;

}

sprintf(Buf,"%s say : %s",inet_ntoa(addrClisin_addr),recvBuf);

printf("%s\n",Buf);

if(a==1)

printf("Say some words ('p' to quit) : \n");

gets(sendBuf);

sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR)&addrCli,len);

a++;

}

closesocket(sockSrv);

WSACleanup();

}

下面是客户端代码:

#include <stdioh>

#include <Winsock2h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

/ Tell the user that we could not find a usable /

/ WinSock DLL /

return;

}

/ Confirm that the WinSock DLL supports 22/

/ Note that if the DLL supports versions greater /

/ than 22 in addition to 22, it will still return /

/ 22 in wVersion since that is the version we /

/ requested /

if ( LOBYTE( wsaDatawVersion ) != 2 ||

HIBYTE( wsaDatawVersion ) != 2 ) {

/ Tell the user that we could not find a usable /

/ WinSock DLL /

WSACleanup( );

return;

}

SOCKET sockCli=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;

addrSrvsin_family=AF_INET;

addrSrvsin_port=htons(5050);

addrSrvsin_addrS_unS_addr=inet_addr("127001");

char recvBuf[200];

char sendBuf[200];

char Buf[400];

int len=sizeof(SOCKADDR);

int a=1;

for(;;)

{

if(a==1)

printf("Say some words ('p' to quit) :\n");

gets(sendBuf);

sendto(sockCli,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR)&addrSrv,len);

recvfrom(sockCli,recvBuf,strlen(recvBuf)+1,0,(SOCKADDR)&addrSrv,&len);

if('q'==recvBuf[0])

{

sendto(sockCli,"q",strlen("q")+1,0,(SOCKADDR)&addrSrv,len);

printf("chat over !");

break;

}

sprintf(Buf,"%s say : %s",inet_ntoa(addrSrvsin_addr),recvBuf);

printf("%s\n",Buf);

a++;

}

}

以上程序使用的是UDP协议,如果想要TCP协议的,过两天我也可以给你发上来。

这个要是猛一说,应该是网络编程需求大一点。

不过你想,网络编程的如果是做业务应用的话,那也肯定离不开数据库编程;如果你只是做一个看图软件之类的,那应该用不到数据库编程。其实像QQ这种看似很小的,其在服务器端也是离不开数据库的。

定义

  通过使用套接字来达到进程间通信目的编程就是网络编程。windows提供的基于网络编程的就是套接字也就是winsock,但是现在Winpcap也是一个比较方便的工具。 网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用,编程人员可以不用考虑…… 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的!中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理! 代码,开发工具,数据库,服务器架设和网页设计这5部分你都要接触 代码分静态代码和动态代码 静态代码是服务器不解析直接发送给客户端的部分,用做布局效果,一般不用于数据库操作 静态代码分html,javascript,css等,其中html语言是基础,要学网络编程就先学html语言javascript用于实现某些特效,css是样式语言这3个语言组合起来,可以设计出美妙的网页效果 动态代码是服务器需要解析的部分,用作数据库连接操作等有php,jsp,asp这几种语言你只用先学一种就可如果是想快速入门,建议先学asp,如果想学了找工作等,建议学php或jsp, 开发工具有很多种,我推荐一种,网络3剑客,其中dw是开发代码的,fw是做图的flash是做动画的 数据库要结合你学的动态语言来选择,asp系列的,你可以使用access,大型点使用mySQL php和mySQL是很好的搭档 服务器架设也是结合你学的动态语言的,windows下安装iis很方便,iis可以运行asp,安装net框架后能运行,这两者架设相对简单,也是我推荐你入门学asp的原因php一般安装apache服务器,jsp一般安装tomcat服务器只有架设好服务器,才能浏览动态语言编写的程序 虽然是编程,但是总会涉及到网页设计部分,还是要去学学怎么简单的作图和动画。编辑本段网络编程介绍

Internet网络模型

  网络模型:描述网络的结构原理和工作原理 OSI参考模型:七层 Internet网络模型:四层 网络协议:指定层上进行数据交换的规则。 Internet的网络层协议:IP协议;DNS协议(辅助协议) Internet的传输层协议:TCP协议;UDP协议。

套接字基础

  套接字(Sockets):应用程序和网络协议的接口。 Java Sockets:Java应用程序和网络协议的接口,提供若干个类的定义。 Java应用程序利用这些类继承网络协议的行为,实现网络通信。 TCP Sockets:使用TCP协议实现可靠的网络通信。 UDP Sockets:使用UDP协议实现效率较高的网络通信。

数据包组包基础

  数据包是网络通信编程的一个重要概念,也称为组装包,指在应用层数据或报文按照一定事先规定好的规则整合的数据集合,实际操作包括组包(打包),数据包传送,解包。 组包(打包),指按照协议把零散的数据或报文按照组合起来,实际应用中,比如在C++编程中,往往定义一种新的数据类型用来存储数据包的结构。数据包传送,指数据包的电气物理传输。解包,指接收端对接收的数据进行解析,获得有用信息和数据。 数据包经常通过套接字来传送.编辑本段网络编程语言:

一、汇编语言

  汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。 汇编程序通常由三部分组成:指令、伪指令和宏指令。

二、高级语言

  高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,这些语言的语法、命令格式都各不相同。高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类: 解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。 编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件( OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如Visual C++、Visual Foxpro、Delphi等。

找了一段,大致涉及到了您的问题:

一、socket的模式

socket一般有两种模式:同步和异步(windows网络编程技术中也可叫锁定和非锁定,Linux网络编程叫阻塞和非阻塞)。

二、socket的类型

socket一般有三种类型,基于TCP的流式套接字,基于UDP的数据报套接字和原始套接字。

三、socket的IO模型

socket

的IO模型是编程中使用socket两种模式的策略,它们适用的场合不同,在不同的操作系统上支持的模型也不同,例如windows从NT版本才开始支持

完成端口模型。Linux和Windows所支持的模型也有区别,当然也有相同的地方,可能叫法不一样,但大致思路是一样的,下面分别介绍windows

和Linux的IO模型

1、 Windows下的套接字IO模型:

A、 Select(选择)模型

用于同步socket的状态检测模型,又叫(Linux)多路复用,可以同时检测多个socket的状态

B、 WSAAsyncSelect(异步选择)模型

用于异步socket的异步事件设置,它是基于Windows消息的模型,必须先打开一个窗口,然后把窗口和socket的消息绑定,这样,在socket有消息通知时,操作系统便通知窗口,然后在窗口进行处理。

C、 WSAEventSelect(异步事件)模型

于异步socket的异步事件,它是基于网络事件的模型,先使用CreateEvent创建一个事件,然后使用WSAEventSelect进行事件绑

定,然后可以使用WaitForMultipleObject(Event)进行事件监听,可以同时监听多个事件,不光是socket的,比如可以监听使

用CreateWaitableTimer创建的Timer等。

D、 重叠IO模型

于异步socket,在创建socket时需要在创建函数WSASocket中使用WSA_FLAG_OVERLAPPED标志,然后在投递IO请求的时

候将一个Overlapped结构体指针赋给投递函数,可以使用WSAWaitForMultipleObject来监听事件,然后使用

WSAGetOverlappedResult来获取IO的状态,也可以在Overlapped结构体中使用完成例程来处理,即在投递函数中把完成例程赋

给投递函数。

E、 完成端口模型

是迄今为止最复杂的一种IO模型,当应用程序需要管理众多的套接字并且希望随着系统内安装的CPU数目的增多,应用程序的性能也可以线性增加,就可以使用

这种模型,它的原理是每个CPU可以单独负责一个线程的执行,避免线程的频繁切换。使用这种模型往往可以达到最佳的系统性能。

先需要使用CreateIOCompletePort来创建完成端口,然后将IO句柄和此端口绑定,绑定也是使用此函数,当然也可以一次完成。接着是创建

工作者线程,工作者线程会使用GetQueuedCompletionStatus进入完成端口维护的线程池,当有完成事件时,会激活一个线程。

2、 Linux下的IO模型

A、阻塞IO

B、非阻塞IO

C、IO多路复用(选择)

D、信号驱动

用于异步socket,首先设定信号处理函数,然后使用fcntl函数设定socket的拥有者,像windows下使用WSAAsncSelect设定socket的窗口一样。使用这种模型,当内核操作可以被操作的时候通知我们的应用程序

E、异步IO

当内核在所有操作完成后才会通知应用程序

四、socket的一些使用上的优化

A、缓冲区的优化,可以考虑让应用程序使用比较小的缓冲区,但同时使用多个WSARecv

B、使用socket选项SO_SNDBUF和SO_RCVBUF设置socket缓冲区大小,如果设为0,操作体系统会使用应用程序的缓冲区,这样避免了从系统缓冲区向用户区复制的开销

五、注意这些IO模型有些不光是针对socket的,其他的IO操作也可以使用,最常用使用的是WriteFile,ReadFile等函数。

其它查考网址:

http://blog163com/tianle_han/blog/static/6617826200821522743948/

http://blogcsdnnet/yibulianhua/article/details/5374317

随着Internet技术的应用和普及,人类社会已经进入了信息化的网络时代。大多数应用程序都是运行在网络环境下,这就要求程序员能够在应用最广泛的Windows操作系统上开发网络应用程序。本教程结合大量的实例,介绍了开发Windows网络应用程序的必备知识,并完整地讲述了几个Windows网络应用程序实例的开发过程。这些实例包括局域网探测器、基于P2P技术的BT下载工具和基于WinPcap技术的网络数据包捕获、过滤和分析工具等。

WINSOCK 是在Windows进行网络通信编程的API接口,也是Windws网络编程的事实标准。在网络编程中最常用的方案便是客户机/服务器模型。 是windows的系统文件,与文件传输又关系 winsock - winsockdll - DLL文件信息 DLL 文件: winsock 或者 winso

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何学习网络编程

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情