计算机网络与高级语言,汇编语言之间的讲解

来源:互联网 发布:大数据架构师招聘青岛 编辑:程序博客网 时间:2024/05/24 03:32
计算机网络与高级语言,汇编语言之间的讲解

首先我申明我并不主攻计算机网络,因此有些地方会讲得不对,请大家多多包含.
首先谈及高级语言中关于网络,与网络联系最紧密的高级语言应该是Java语言,Java语言中分为Application小程序和Applet程序.我们所说的Application小程序,就是我们平常用的应用程序,而Applet则是Java专门用于嵌入网页代码的应用程序.
当然Applet是AWT控件类中的,现在Java提出更时兴的控件类Swing控件,中的JApplet也是可以嵌入网页中的.
看看在所有语言中都有协议族.我们在编程所用的是Socket协议族中的内容包含常用的两个协议"TCP协议"与"UDP协议",在Java中也不例外.
看一个最简单的Java网络编程.
一个简单的Java服务端
import java.net.*;
import java.io.*;

public class SimpleServer{
public static void main(String args[]) throws Exception {
ServerSocket serverSocket=new ServerSocket(8000,2);
Thread.Sleep(360000);
}
}
一个与之对应的Java简单客户端
import java.net.*;
import java.io.*;

public class SimpleClient{
public static void main(String args[]) throws Exception {
Socket s1=new Socket("localhost",8000);
System.out.println("第一次连接成功");
Socket s2=new Socket("localhost",8000);
System.out.println("第二次连接成功");
Socket s3=new Socket("localhost",8000);
System.out.println("第三次连接成功");
}
}
作为服务端是接受客户端的访问,由于睡眠6分钟,在此过程中第三次连接未成功.由于连接请求队列只能容纳2次申请,但是在六分钟内没有释放连接请求,Java就会抛出ConnectException异常.
这是一个简单的Java网络实例,证实了网络编程主要依靠Socket提供服务,而Socket原来就存在于操作系统中,再往下看你就会明白.
再谈谈Visual Basic.NET中网络编程,我再不会把整个实例都搬出来.我只会写下部分代码!这个实例说明协议族的作用.
我刚才不是抛出了协议族吗?在协议族中有协议类型Tcp或Udp.看看这段代码!
MySocket=new System.net.Sockets.Socket(System.Net.Sockets.AddressFamily.interNetWork,System.Net.Sockets.SocketType.Stream,System.Net.Sockets.ProtocolType.Tcp)这段代码就是设置协议的.首先这是使用Tcp连接方式,用的协议是Tcp协议,用的套接字类型是流套接字,使用协议族Internet协议族.
对于tcp协议来说遵循"三次握手"原则,首先是监听来自客户端的数据包.如果收到就会向客户端发送已收到的确认信息.对于客户端来说也是这样,但他不需要监听,所以服务端往往作为转发数据包的中间站,他又同时为客户端维护一张客户端列表,并且每次有新客户上线后就会刷新客户端列表.
因此对于服务端来说MySocket.Listen(50),只会监听,然后接受MySocket.Accept().最会处理发送过来的数据.
下面一个关于汇编的实例,你会完全了解网络Socket的结构.先看看代码和实现效果
汇编代码:
.386
.model flat,stdcall
option casemap:none
include F:/masm32/include/windows.inc
include F:/masm32/include/user32.inc
includelib F:/masm32/lib/user32.lib
include F:/masm32/include/kernel32.inc
includelib F:/masm32/lib/kernel32.lib
include F:/masm32/include/wsock32.inc
includelib F:/masm32/lib/wsock32.lib
ICO_MAIN equ 1000
DLG_MAIN equ 2000
IDC_COUNT equ 2001
TCP_PORT equ 9999
.data?
hInstance dd ?
hWinMain dd ?
hListenSocket dd ?
dwThreadCounter dd ?
dwFlag dd ?
F_STOP equ 0001h
.const
szErrBind db '无法绑定到TCP端口9999,请检查是否有其它程序在使用!',0
.code
_ServiceThread proc _hSocket
local @stFdSet:fd_set,@stTimeval:timeval
local @szBuffer[512]:byte
inc dwThreadCounter
invoke SetDlgItemInt,hWinMain,IDC_COUNT,dwThreadCounter,FALSE
.while !(dwFlag & F_STOP)
mov @stFdSet.fd_count,1
push _hSocket
pop @stFdSet.fd_array
mov @stTimeval.tv_usec,200*1000
mov @stTimeval.tv_sec,0
invoke select,0,addr @stFdSet,NULL,NULL,addr @stTimeval
.break .if eax==SOCKET_ERROR
.if eax
invoke recv,_hSocket,addr @szBuffer,sizeof @szBuffer,0
.break .if eax==SOCKET_ERROR
.break .if !eax
invoke send,_hSocket,addr @szBuffer,eax,0
.break .if eax==SOCKET_ERROR
.endif
.endw
invoke closesocket,_hSocket
dec dwThreadCounter
invoke SetDlgItemInt,hWinMain,IDC_COUNT,dwThreadCounter,FALSE
ret
_ServiceThread endp
_ListenThread proc _lParam
local @stSin:sockaddr_in
invoke socket,AF_INET,SOCK_STREAM,0
mov hListenSocket,eax
invoke RtlZeroMemory,addr @stSin,sizeof @stSin
invoke htons,TCP_PORT
mov @stSin.sin_port,ax
mov @stSin.sin_family,AF_INET
mov @stSin.sin_addr,INADDR_ANY
invoke bind,hListenSocket,addr @stSin,sizeof @stSin
.if eax
invoke MessageBox,hWinMain,addr szErrBind,NULL,MB_OK or MB_ICONSTOP
invoke ExitProcess,NULL
ret
.endif
invoke listen,hListenSocket,5
.while TRUE
invoke accept,hListenSocket,NULL,0
.break .if eax==INVALID_SOCKET
push ecx
invoke CreateThread,NULL,0,offset _ServiceThread,eax,NULL,esp
pop ecx
invoke CloseHandle,eax
.endw
invoke closesocket,hListenSocket
ret
_ListenThread endp

_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @stWsa:WSADATA

mov eax,wMsg
.if eax==WM_INITDIALOG
push hWnd
pop hWinMain
invoke WSAStartup,101h,addr @stWsa
push ecx
invoke CreateThread,NULL,0,offset _ListenThread,0,NULL,esp
pop ecx
invoke CloseHandle,eax

.elseif eax==WM_CLOSE
invoke closesocket,hListenSocket
or dwFlag,F_STOP
.while dwThreadCounter
.endw
invoke WSACleanup
invoke EndDialog,hWinMain,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret

_ProcDlgMain endp

start:
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL

end start
还是根据上面的Visual Basic.Net来说,实际上ProtocolType不仅仅只指Tcp和Ucp协议还包括ip,icmp等等只是我们编程时用的较少而已.被忽略掉了.IPPROTO_IP,IPPROTO_ICMP,IPPROTO_TCP,IPPROTO_UDP,IPPROTO_RAW这都算是协议类型.
而我们在编程时,我们一开始就要加载WSAStartup这是加载WinSock库.我查了一下自己的System32中的Dll函数库,发现与WinSock相关的动态链接库有两个WS2_32.dll和WinSock.dll,但是我没有WinSock32.dll,但这并不影响,WinSock.dll和WinSock32.dll一个是16位版本,一个是32位版本.而WinSock主要代码来自于WS2_32.dll文件中.
他和其他高级语言都通过建立套接字来建立通讯,往往套接字只能占用一个端口来连接,就像电话线一样占用之后,就不能再向其他人打电话,别人也打不进来.
而套接字类型:分为三种SOCK_STREAM(流套接字).SOCK_DGRAM(数据包套接字),SOCK_RAW(原始套接字).
而协议族也分为三种:
地址类型,协议族,可以是如下值:
AF_UNIX //UNIX域协议族,本机的进程间通讯时使用
AF_INET //Internet协议族(TCP/IP)
AF_ISO //ISO协议族

原创粉丝点击