欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    windowsSockets编程.pdf

    • 资源ID:76243595       资源大小:306.53KB        全文页数:23页
    • 资源格式: PDF        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    windowsSockets编程.pdf

    陈家琪:计算机网络WinSock 网络编程第2页 共23页2UDP(用户数据报协议)提供无连接的数据 报传输服务。数据通过相互独立 的报文进行 传输,是无序的,并且不保证可靠、无差错。3.WinSock DLL?WinSock 与操作系统 的关系应用程序 1网络编程接口 如 WinSock API网络 通信协议如 TCP/IP 协议操作系统 如 Windows应用程序 2动态链接库物理 通信介 质?动态链接库:16位版:WINSOCK.DLL 32位版:WSOCK32.DLLDLL 装载WinSock 服务由动态连接库WinSock DLL提供,它完成 WinSock 的初始化任 务,协 商WinSock 的版本支持,并分配必要的资源。在使用WinSock API 之前,必须调用:?int WSAStartup(WORD v,(LPWSADATA)&WD)其中:v 指示应用程序 对WinSock 版本的要求,低字节 为主版本号,高字节为副版本号。例:v1.1 v=Ox0101,v2.0 v=Ox0002,WD 返回WinSock 的实现 信息。WD 是一个 WSADATA 结构:struct WSADATA WORD wVersion;WORD wHighVersion;char szDescriptionWSADESCRIPTION_LEN+1;char szSystemStatusWSASYSSTATUS_LEN+1;陈家琪:计算机网络WinSock 网络编程第3页 共23页3 unsigned short iMaxSockets;unsigned short iMaxUdpDg;char FAR*lpVendorInfo;结构成员说明wVersion:DLL 支持的WinSock 规范的 版本;wHighVersion:DLL 可支持 的WinSock 规范的 最高版本;szDescription:DLL 的说明及厂商描述;szSystemStatus:DLL 将相关 的状态和配置信息;iMaxSockets:一个进程可以打 开的最大套接口数 目;iMaxUdpDg:应用程序发 送或接收的最大UDP数据报的大小;如果应用程序 没有给出限 制,iMaxUdpDg 为0(隐含为8192 字节)。最小值为512。lpVendorInfo:指向厂商 规定数据 结构的远指针。调用成功,返回0。DLL 卸载当不需WinSock DLL的服务,释放DLL 所使用的资源。应用程序 必须调 用:?int WSACleanup()调用成功,返回0。对应于每一次WSAStartup()调用必须有一个WSACleanup()调用。4.套接口 Socket Socket实际上是一个 通信端口;一个Socket是通讯的一端。网络通信将通过 各自的Socket 相联系。在应用开发 中就像使用文件句柄 一样,应用程序 向操作系统 申请,由操作系统 分配本地唯一 的Socket 端口号。然后,可以对 Socket 句柄进行读,写操作。?创建Socket:SOCKET socket(int af,/套接口 所用地址族 int type,/套接口 类型陈家琪:计算机网络WinSock 网络编程第4页 共23页4 int protocol/套接口 所用协议 )参数说明AF_INET TCP/IP 地址af AF_UNIX.UNIX地址SOCK_STREAM 数据流套接口,对应TCP协议SOCK_DGRAM 数据报套接口,对应UDP协议type.IPPROC_TCP 使用TCP/IP 的TCP协议IPPROC_UDP 使用TCP/IP 的UDP协议.protocol 0 和 基本确定了一 种协议,若调用者不想指定,设置为0。返回值:若无错误发生,socket()返回引用套接口的 描述字(套接口 号)。否则的话,返回SOCKET_ERROR 错误,即-1。应用程序 可通过 WSAGetLastError()获取相应错误代码。5.主机地址标识网络环境中的唯一通信端点 标识。包含:协议、IP地址、端口。(俗称 三元组)关于端口:在TCP/IP 中,TCP与UDP使用彼此独立的端口;端口大小:16bit(共216个)端口分为:系统 全局端口:11023;例,HTTP为TCP/80,FTP为TCP/21、UDP/69,SMTP为TCP/25 系统 自动分配端口:10245000;自由端口:500065535;6.主机地址标识的数据结构struct sockaddr u_short sa_family;/协议族char sa_data14;/主机地址标识(端口号、IP 地址);陈家琪:计算机网络WinSock 网络编程第5页 共23页5struct sockaddr_in short sin_family;/协议族 u_short sin_port;/16bit端口号,网络字节顺 序 struct in_addr sin_addr;/32bit的IP 地址,网络 字节顺 序 char sin_zero8;/未用;其中:struct in_addr u_long s_addr;/32bit的IP 地址,网络 字节顺 序;网络字节顺 序:16 bit/32 bit 整数存放格式 高字节在前,低字节在后。?设置主机地址/-void SetSockAddr(struct sockaddr_in*A,WORD Port,char*IP)A-sin_family =AF_INET;/TCP/IP协议A-sin_port =htons(Port);/端口号。A-sin_addr.s_addr =inet_addr(IP);/IP地址。/-函 数作 用htons()把16 bit 的数字从主机字节顺 序转换到网络字节顺 序inet_addr()把一个IP地址格式 A.B.C.D 转换成32 bit 的网络字节顺 序注:Intel CPU 的主机字节顺 序:16 bit/32 bit 整数存放格式 低字节在前,高字节在后。7.Socket 号与主机地址捆绑将IP地址和端口号与所创建 的Socket 号联系起来。?int bind(SOCKET s,/待捆绑 Socket struct sockaddr far*name,/赋予Socket的主机地址标识int len/name的长度);调用成功,返回0。陈家琪:计算机网络WinSock 网络编程第6页 共23页68.WinSock操作模式同步模式 或阻塞模式(blocking mode)采用DOS技术编程,某些WinSock 函数(同步函 数)直到完成操作 后才返回。例,当执行数据接 收函数revc()时,一直等待对方发送数据,直到接收到数据后才返回。异步模式 或非阻塞模式(non-blocking mode)采用Windows 技术编程,利用 消息(事件驱动)的特点,使同步函 数变为异步函 数(不产生阻塞)。关键:异步选择函 数WSAAsyncSelect()的使用。WSAAsyncSelect()可设置一个或多个网络 事件消息,如,已收到数据、数据发 送完毕、客户机请求连接、服务器已完成连 接等网络 事件。当设置的网络 事件发生时,Windows 应用程序的 窗口函数将收到一个消息。通过这个消息就可以进行相 应的处理。int WSAAsyncSelect(SOCKET s,/需要事件驱动的套接口HWND hWnd,/接收消息的窗口句柄unsigned int wMsg,/网络事件发生时的消息字long lEvent /用于指明感兴趣的网络 事件集合);lEvent参数由下表中列出的值组成:值意义FD_READ 已接收到数据FD_WRITE 数据发送完毕FD_OOB 已接收到边带数据FD_ACCEPT 客户机请求连接,用于服务 器端FD_CONNECT 服务器已完成连接,用于 客户机端FD_CLOSE 连接关闭(对方的套接口 关闭)例:WSAAsyncSelect(S,hW,WM_USER+1,FD_ACCEPT|FD_READ|FD_CLOSE);程序结束时,应注销异步选择:WSAAsyncSelect(S,hW,0,0);陈家琪:计算机网络WinSock 网络编程第7页 共23页79.无连接协议的同步模式编程无连接服务器一般都是面向事务处理的。一个请求一个应答就完成了客户程序与服务程序 之间的相互作 用。工作过程:服务器服务请求服务应 答无连接套接口应用程序时序图S=socket(.)bind(S,.)sendto(S,.)recv(S,.)阻塞,等待客户 请求处理服务 请求closesocket(S)继续 服务?YN客户机S=socket(.)bind(S,.)sendto(S,.)recv(S,.)阻塞,等待服务数据处理数据closesocket(S)继续?YN服务器首先启 动,通过调用socket()建立一个套接口,然后bind()将该套接口 和本地地址(IP 地址和端口)联系在一起,服务器调用recv()等待接收数据。客户机通过调 用socket()建立一个套接口,然后bind()将该套接口 和本地地址(IP 地址和端口)联系在一起,客户机调用sendto()向服务器发送数据;服务器的recv()接收到客户机的数据 后,调用sendto()向客户机发送应答数据;客户机的recv()便接收到了服务 器的应答数据;最后,待数据传送结束后,双方调用closesocket()关闭套接口。陈家琪:计算机网络WinSock 网络编程第8页 共23页8编程示例:/UDP(TCP/IP)for the console application./VC6.0 add WSOCK32.LIB in Project-Settings.-Link#include stdafx.h#include /by user#include /by user WORD RPort=6666;/远程端口RemotePort char RIP16=127.0.0.1;/远程IP 地址RemoteIPAddr WORD LPort=7777;/本地端口LocalPort char LIP16=127.0.0.1;/本地IP 地址LocalIPAddr SOCKET S;/套接口 SOCKET struct sockaddr_in rAddr;/远程参数,remoteAddr struct sockaddr_in lAddr;/本地参数,localAddr WSADATA WD;/WinSock DLL信息int r;/result;/-void ShowInfo(char*info)puts(info);exit(1);/-void SetSockAddr(struct sockaddr_in*A,WORD Port,char*IP)A-sin_family=AF_INET;/TCP/IP协议A-sin_port=htons(Port);/端口。A-sin_addr.s_addr=inet_addr(IP);/IP网址。/-void main()WORD v;/wVersionRequested;/-Startup Win Socket-v=0 x0101;/0 x0101 for v1.1,0 x0002 forv 2.0 r=WSAStartup(v,(LPWSADATA)&WD);if(r!=0)ShowInfo(Start_Error);/-Create Win Socket-S=socket(PF_INET,SOCK_DGRAM,0);if(S=-1)ShowInfo(Socket_Create_Error);int l=sizeof(rAddr);char Msg80;puts(Type exit then Quit Program!);SetSockAddr(lAddr,LPort,LIP);陈家琪:计算机网络WinSock 网络编程第9页 共23页9r=bind(S,(struct sockaddr far*)&lAddr,sizeof(lAddr);if(r=-1)ShowInfo(bind_Error);SetSockAddr(&rAddr,RPort,RIP);do/-Send Mess-puts(Send:);gets(Msg);if(!strcmp(Msg,exit)break;r=sendto(S,Msg,strlen(Msg),0,(struct sockaddr far*)&rAddr,l);if(r=-1)ShowInfo(Send_Error);/-Recieve Mess-puts(Send ok!Waiting Recieve.);r=recv(S,Msg,80,0);/r=recvfrom(SD,Msg,80,0,(struct sockaddr far*)&rAddr,&l);/发送套接口的 主机地址 信息存放在rAddr 中if(r=-1)ShowInfo(Recieve_Error);Msgr=0;puts(Msg);puts(Recieve ok!);while(1);closesocket(S);WSACleanup();return;/-说明:在VC中进行 WinSock API 编程开发,需要使用到下面三个文件:winsock.h WinSock API 的头文件wsock32.LIB WinSock API 的连接库,把它作为项目的非缺省 的连 接 库 包 含 到 项 目 文 件 中 去。(Project-Settings.-Link)wsock32.DLL WinSock API 的动态 连接库,位于windows 的系统目录下(95/98:system、NT:system32)。?int sendto(/向一指定目的地发送数据SOCKET s,/源套接口char*buf,/待发送数据的缓冲区int buflen,/缓冲区 中数据的 长度int flags,/调用方式标志位,一般取0 struct sockaddr FAR*to,/指向目 的套接口的 主机地址int tolen/目的套接口 主机地址 的长度陈家琪:计算机网络WinSock 网络编程第10页 共23页10);主要用于 SOCK_DGRAM 类型套接口 向to 参数指定端的套接口发 送数据 报。对于SOCK_STREAM 类 型套接口,to 和tolen 参数被忽略;这种情况 下sendto()等价于send()。?int recv(/从一个套接口接收数据SOCKET s,/接收套接口char*buf,/接收数据的 缓冲区int len,/缓冲区 中数据的 长度int flags/调用方式标志位,一般取0);?int recvfrom(/从一个套接口接收数据SOCKET s,/接收套接口char*buf,/接收数据的 缓冲区int len,/缓冲区 中数据的 长度int flags/调用方式标志位,一般取0 struct sockaddr FAR*from,/获取发送套接口的 主机地址int fromlen/发送套接口的 主机地址的长度);陈家琪:计算机网络WinSock 网络编程第11页 共23页1110.无连接协议的异步模式编程A.程序结构UDP-WinSock-Windows 应用程序 结构图closesocket(S)客户机服务器S=socket(.)bind(S,.,lAddr)WSAAsyncSelect(S,.,USER+1,FD_READ)FD_READ处理服务请求WM_DESTROYWSAAsyncSelect(S,.,0,0)returnWM_CREATEWinMain(.)recvfrom(S,.,&rAddr)sendto(S,.,rAddr)WndProc(消息)USER+1windows消息处理closesocket(S)S=socket(.)WSAAsyncSelect(S,.,USER+1,FD_READ)FD_READ处理服务数据WM_DESTROYWSAAsyncSelect(S,.,0,0)returnWM_CREATEWinMain(.)recv(S,.)WndProc(消息)USER+1windows消息处理sendto(S,.,rAddr)发送消息事件WSACleanup()WSAStartup(.)WSAStartup(.)WSACleanup()设置本地lAddr设置服务器rAddr服务 请求服务数据注:服务器端口:通过bind(),设置确定的服务 器端口号;服务器IP 地址:使用本地的主机IP 地址;客户机端口:由操作系统 自动分配;可以不使 用bind()。客户机IP 地址:使用本地的主机IP 地址;服务器收到客户 机的服务 请求时,revcfrom(S,.,&rAddr)可获得客户 机的主机地址信息rAddr,然后,发送sendto(S,.,rAddr)。陈家琪:计算机网络WinSock 网络编程第12页 共23页12B.编程示例服务器程序/服务器端口:6666;/服务器IP 地址:使用本机的主机IP 地址;/UDPSer01(TCP/IP)for the windows application./*VC6.0 File-New-Projects-选项 (输入Project name:ServerW01-按OK按钮)-选项-按Finish按钮-按OK按钮-./VC6.0 add WSOCK32.LIB in Project-Settings.-Link#include stdafx.h/VC#include /by user/-char Title=UDPSer01;/窗口标题HINSTANCE hInst;/current instance LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/-int APIENTRY WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lp,int nC)MSG msg;HWND hWnd;hInst=hI;/Store instance handle in our global variable WNDCLASS wc;memset(&wc,0,sizeof(WNDCLASS);wc.lpfnWndProc=(WNDPROC)WndProc;wc.hInstance=hI;wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);wc.hbrBackground=(HBRUSH)COLOR_WINDOW;wc.lpszClassName=W1;RegisterClass(&wc);/特殊窗 口1,始终在顶层,任务栏显示。hWnd=CreateWindowEx(WS_EX_TOPMOST,W1,Title,WS_DLGFRAME|WS_SYSMENU,200,1,200,20,NULL,NULL,hI,NULL);if(!hWnd)return FALSE;ShowWindow(hWnd,nC);while(GetMessage(&msg,NULL,0,0)/Main message loop TranslateMessage(&msg);DispatchMessage(&msg);陈家琪:计算机网络WinSock 网络编程第13页 共23页13 return msg.wParam;/-WSADATA ws;SOCKET S;/定义套接口 变量struct sockaddr_in lAddr,rAddr;/本地主机地址 和远程主机地址变量int LPort=6666;/本地端口(即服务器端口)char LIP=0.0.0.0;/IP地址取 本机的主机 IP 地址(若多个,都有效)char Msg88;int d,l=sizeof(rAddr);/-void SetSockAddr(struct sockaddr_in*A,WORD Port,char*IP)A-sin_family=AF_INET;/TCP/IP协议A-sin_port=htons(Port);/端口。A-sin_addr.s_addr=inet_addr(IP);/IP网址。/-/消息处理LRESULT CALLBACK WndProc(HWND hW,UINT msg,WPARAM wP,LPARAM lP)switch(msg)case WM_DESTROY:WSAAsyncSelect(S,hW,0,0);/注销网络 异步选择事 件消息closesocket(S);/关闭套接口WSACleanup();/卸载网络动态链接库PostQuitMessage(0);/向窗口发 送程序退出消息break;case WM_CREATE:WSAStartup(0 x0101,&ws);/装载网络动态链接库S=socket(AF_INET,SOCK_DGRAM,0);/创建套接口SetSockAddr(&lAddr,LPort,LIP);/设置本地主机地址参数bind(S,(struct sockaddr*)&lAddr,sizeof(lAddr);/捆绑本地主机地址WSAAsyncSelect(S,hW,WM_USER+1,FD_READ);/注册网络 异步选择事 件消息break;case WM_USER+1:switch(LOWORD(lP)case FD_READ:d=recvfrom(S,Msg,sizeof(Msg),0,/接收客户机信息 (struct sockaddr*)&rAddr,&l);/Msg=接收到的信息,d=接收到的字符数,陈家琪:计算机网络WinSock 网络编程第14页 共23页14/rAddr=客户机的主机地址Msgd=0;char buf88;wsprintf(buf,from Client:%s,Msg);SetWindowText(hW,buf);/在窗口标 题栏显 示接收的信息/把接收的信息发回给客户机sendto(S,Msg,strlen(Msg),0,(struct sockaddr*)&rAddr,l);break;break;return DefWindowProc(hW,msg,wP,lP);/-客户机程序/客户机端口:由操作系统 自动分配;/客户机IP 地址:使用本机的主机IP 地址;/UDPCli01(TCP/IP)for the windows application./VC6.0 add WSOCK32.LIB in Project-Settings.-Link#include stdafx.h/VC#include /by user/-char Title=UDPCli01;/窗口标题HINSTANCE hInst;/current instance LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/-int APIENTRY WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lp,int nC)MSG msg;HWND hWnd;hInst=hI;/Store instance handle in our global variable WNDCLASS wc;memset(&wc,0,sizeof(WNDCLASS);wc.lpfnWndProc=(WNDPROC)WndProc;wc.hInstance=hI;wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);wc.hbrBackground=(HBRUSH)COLOR_WINDOW;wc.lpszClassName=W1;RegisterClass(&wc);/特殊窗 口1,始终在顶层,任务栏显示。hWnd=CreateWindowEx(WS_EX_TOPMOST,W1,Title,WS_DLGFRAME|WS_SYSMENU,陈家琪:计算机网络WinSock 网络编程第15页 共23页15400,1,200,40,NULL,NULL,hI,NULL);if(!hWnd)return FALSE;ShowWindow(hWnd,nC);while(GetMessage(&msg,NULL,0,0)/Main message loop TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;/-WSADATA ws;SOCKET S;/定义套接口 变量struct sockaddr_in rAddr;/远程主机地址 变量int RPort=6666;/远程服务 器端口char RIP16=127.0.0.1;/远程服务 器 IP 地址char Msg88;int d,l=sizeof(rAddr);/-void SetSockAddr(struct sockaddr_in*A,WORD Port,char*IP)A-sin_family=AF_INET;/TCP/IP协议A-sin_port=htons(Port);/端口。A-sin_addr.s_addr=inet_addr(IP);/IP网址。/-/消息处理LRESULT CALLBACK WndProc(HWND hW,UINT msg,WPARAM wP,LPARAM lP)switch(msg)case WM_DESTROY:WSAAsyncSelect(S,hW,0,0);/注销网络 异步选择事 件消息closesocket(S);/关闭套接口WSACleanup();/卸载网络动态链接库PostQuitMessage(0);/向窗口发 送程序退出消息break;case WM_CREATE:WSAStartup(0 x0101,&ws);/装载网络动态链接库S=socket(AF_INET,SOCK_DGRAM,0);/创建套接口SetSockAddr(&rAddr,RPort,RIP);/设置远程服务 器主机地址 参数WSAAsyncSelect(S,hW,WM_USER+1,FD_READ);/注册网络 异步选择事 件消息break;陈家琪:计算机网络WinSock 网络编程第16页 共23页16case WM_USER+1:switch(LOWORD(lP)case FD_READ:d=recv(S,Msg,sizeof(Msg),0);/接收服务器数据Msgd=0;char buf88;wsprintf(buf,from Server:%s,Msg);SetWindowText(hW,buf);/在窗口标 题栏显 示接收的信息break;break;case WM_LBUTTONDOWN:/鼠标左键按 下wsprintf(Msg,Hello!);/发送Hello!sendto(S,Msg,strlen(Msg),0,(struct sockaddr*)&rAddr,l);break;case WM_RBUTTONDOWN:/鼠标右键按 下wsprintf(Msg,Hi!);/发送Hi!sendto(S,Msg,strlen(Msg),0,(struct sockaddr*)&rAddr,l);break;return DefWindowProc(hW,msg,wP,lP);/-陈家琪:计算机网络WinSock 网络编程第17页 共23页1711.面向连接协议的同步模式编程工作过程:服务器首先启 动,通过调 用socket()建立一个套接口,然后bind()将该套接口 和本地地址(IP 地址和端口)联系在一起,再listen()使套接口 做好侦听 的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接,并获得客户 机的地址信息;客户在建立套接口 后就可调用connect()和服务器建立连接;连接一旦建立,客户机和服务 器之间就可以通过调 用:send()和recv()(或read()和write()来发送和接收数据;最后,待数据传送结束后,双方调用closesocket()关闭套接口。服务器服务请求服务应 答面向连接套接口 应用程序 时序图socket()bind()send()recv()阻塞,等待客户 请求处理服务 请求close(socket)继续 服务?YN客户机socket()connect()send()recv()阻塞,等 待服务数据处理数据closesocket()继续?YNlisten()accept()阻塞,等待客户连接连接请求陈家琪:计算机网络WinSock 网络编程第18页 共23页1812.面向连接协议的异步模式编程A.程序结构TCP-WinSock-Windows应用程序结构 图closesocket(S)客户机服务器Ss=socket(.)bind(Ss,.,SA)WSAAsyncSelect(S,.,USER+1,FD_ACCEPT|.)FD_ACCEPT处理连 接 请求WM_DESTROYWSAAsyncSelect(S,.,0,0)returnWM_CREATEWinMain(.)Cs=accept(Ss,.,&CA)send(Cs,.)WndProc(消息)USER+1windows消息处理closesocket(S)Cs=socket(.)FD_READ处理服务数据WM_DESTROYWSAAsyncSelect(S,.,0,0)returnWM_CREATEWinMain(.)recv(,.)WndProc(消息)USER+1windows消息处理send(Cs,.)发送消息事件WSACleanup()WSAStartup(.)WSAStartup(.)WSACleanup()设置本地 SA设置服务器SAlisen(Ss,.)recv(Cs,.)FD_ READ处理服务请求send(Cs,.)FD_CLOSE得知客户 机断开连接WSAAsyncSelect(S,.,USER+1,FD_READ|.)Ss=connect(Cs,.,SA)FD_CLOSE得知服务器断开连 接服务 请 求服务数据FD_CONNECT得知连 接 到服务器陈家琪:计算机网络WinSock 网络编程第19页 共23页192.编程示例:服务器程序/TCP-Server(TCP/IP)for the windows application./*VC6.0 File-New-Projects-选项 (输入Project name:ServerW01-按OK按钮)-选项-按Finish按钮-按OK按钮-.*/VC6.0 add WSOCK32.LIB in Project-Settings.-Link#include stdafx.h/VC#include /by user/-char Title=TCPServer;/窗口标题HINSTANCE hInst;/current instance LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/-int APIENTRY WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lp,int nC)MSG msg;HWND hWnd;hInst=hI;/Store instance handle in our global variable WNDCLASS wc;memset(&wc,0,sizeof(WNDCLASS);wc.lpfnWndProc=(WNDPROC)WndProc;wc.hInstance=hI;wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);wc.hbrBackground=(HBRUSH)COLOR_WINDOW;wc.lpszClassName=W1;RegisterClass(&wc);/特殊窗 口1,始终在顶层,任务栏显示。hWnd=CreateWindowEx(WS_EX_TOPMOST,W1,Title,WS_DLGFRAME|WS_SYSMENU,400,1,200,40,NULL,NULL,hI,NULL);if(!hWnd)return FALSE;ShowWindow(hWnd,nC);/Main message loop:while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;/-陈家琪:计算机网络WinSock 网络编程第20页 共23页20WSADATA ws;SOCKET Ss,Cs;/服务器和客户机的套接口 变量struct sockaddr_in SA,CA;/服务器和客户机的主机地址 变量WORD SPort=6666;/本机端口(服务器)char SIP16=127.0.0.1;/本机IP 地址(服务器)char Msg88;int d,l=sizeof(CA);/-void SetSockAddr(struct sockaddr_in*A,WORD Port,char*IP)A-sin_family=AF_INET;/TCP/IP协议A-sin_port=htons(Port);/端口。A-sin_addr.s_addr=inet_addr(IP);/IP网址。/-/消息处理LRESULT CALLBACK WndProc(HWND hW,UINT msg,WPARAM wP,LPARAM lP)switch(msg)case WM_CREATE:/消息:产生窗口WSAStartup(0 x0101,&ws);Ss=socket(AF_INET,SOCK_STREAM,0);/创建套接口(流式)SetSockAddr(&SA,SPort,SIP);/设置服务器主机地址bind(Ss,(struct sockaddr*)&SA,sizeof(SA);/捆绑主机地址/向windows 注册套接口 Ss所产生的网络 消息事件。WSAAsyncSelect(Ss,hW,WM_USER+1,FD_ACCEPT|FD_READ|FD_CLOSE);listen(Ss,5);/监听客户 机连接请求break;case WM_DESTROY:/消息:关闭窗口WSAAsyncSelect(Ss,hW,0,0);/注销套接口 Ss的消息事件。closesocket(Ss);/关闭套接口 Ss WSACleanup();/卸载WinSock DLL PostQuitMessage(0);/向windows 发送退出程序的 消息break;case WM_USER+1:switch(LOWORD(lP)case FD_ACCEPT:Cs=accept(Ss,(struct sockaddr*)&CA,&l);/获取客户机主机地址wsprintf(Msg,S:Welcome!);send(Cs,Msg,strlen(Msg),0);/向客户机发送连接应答break;case FD_READ:陈家琪:计算机网络WinSock 网络编程第21页 共23页21d=recv(wP,Msg,sizeof(Msg),0);/接收客户机服务请求,wP=Cs Msgd=0;SetWindowText(hW,Msg);/在窗口标题栏显 示服务 请求send(wP,Msg,strlen(Msg),0);/向客户机发送服务数据break;case FD_CLOSE:wsprintf(Msg,Client leave!%d,wP);SetWindowText(hW,Msg);/在窗口标题栏显 示信息break;break;return DefWindowProc(hW,msg,wP,lP);/-客户机程序

    注意事项

    本文(windowsSockets编程.pdf)为本站会员(索****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开