织梦CMS - 轻松建站从此开始!

罗索

Windows网络编程极浅谈

jackyhwei 发布于 2010-07-28 12:19 点击:次 
Socket来自U.C.Berkele的UNIX操作系统上的网络接口,后来逐步移植到Windows,Windows Socket规范起源于90年代初,由SUN,JSB,FTP,MICRODYNE和MICROSOFT共同制定。依次有1.0,1.1,2.0和 3.0。
TAG:

参考资料:Winsocket编程之套接字原理

      Socket来自U.C.Berkele的UNIX操作系统上的网络接口,后来逐步移植到Windows,Windows Socket规范起源于90年代初,由SUN,JSB,FTP,MICRODYNE和MICROSOFT共同制定。依次有1.0,1.1,2.0和3.0。
      Windows Soket规范定义并记录了如何使用API与Internet/Intranet协议连接,Socket是网络通信的基本操作单元,本地主机和远地主机通过对Socket的读写来完成网络之间的相互通信。一个正在被使用的Socket都有它的类型和与其相关的进程。
      目前Windows支持两种套接口:流套接口和数据报套接口。TCP/IP中的TCP协议使用的就是流套接口,提供了面向连接的,无差错的,发送先后顺序一致,包长度不限和非重复的网络信包传输。TCP/IP中的UDP则使用数据报套接口,该接口提供双向的,有序的,无重复并无记录边界的数据流服务,以独立的数据包进行网络传输,信包最大长度32KB,传输不保证顺序性,可靠性和无重复性。数据报支持双向的数据流。

      Windows Socket使用客户机/服务器模式,在这里分别对两种进行介绍:
      服务器要先启动:
      1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
      2、等待客户请求到达该端口。
      3、接收到重复服务请求,处理该请求并发送应答信号。
      4、返回第二步,等待另一客户请求。
      5、关闭服务器。
      客户方:
      1、打开一通信通道,并连接到服务器所在主机的特定端口。
      2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……
      3、请求结束后关闭通信通道并终止。

      基本套接字接口:
      1、创建套接字——socket()
      2、指定本地地址——bind()
      3、建立套接字连接——connect()和accept()
      4、监听连接——listen()
      5、数据传输——send()与recv()
      6、多路复用——select()
      7、关闭套接字——closesocket()

面向连接的套接字的系统调用时序图




无连接协议的套接字调用时序图


面向连接的应用程序流程图

MFC实际程序范例:
客户端:
加入wsock32.lib。

  1. #include "winsock.h" 
  2. #define PORT 7777 
  3. char TARGET_ADDRESS[] = "10.167.16.56"
  4.  
  5. void CDlg::OnSend() 
  6. char Buffer[1000]; 
  7. WSADATA wsaData; 
  8. int retval; 
  9. struct sockaddr_in server; 
  10. SOCKET conn_socket; 
  11.  
  12. this->UpdateData(true); 
  13. strcpy(Buffer,m_send); 
  14.  
  15. //初始化SOCKET 
  16. if(WSAStartup(0x202,&wsaData)!=0) 
  17. AfxMessageBox("Socket 初始化错误"); 
  18. WSACleanup(); 
  19. return
  20.  
  21. server.sin_family = AF_INET; 
  22. server.sin_addr.s_addr = inet_addr(TARGET_ADDRESS); 
  23. server.sin_port = htons(PORT); 
  24.  
  25. //建立socket 
  26. conn_socket = socket(AF_INET,SOCK_STREAM,0); 
  27. if(conn_socket < 0) 
  28. AfxMessageBox("Socket 错误"); 
  29. return
  30.  
  31. //连接服务器 
  32. if(connect(conn_socket,(LPSOCKADDR)&server,sizeof(SOCKADDR))
  33.  == SOCKET_ERROR) 
  34. int i = WSAGetLastError(); 
  35. AfxMessageBox("连接失败"); 
  36. return
  37.  
  38. //发送数据 
  39. retval = send(conn_socket,Buffer,m_send.GetLength(),0); 
  40. closesocket(conn_socket); 
  41. return
  42. }  

服务器端:

加入wsock32.lib。

  1. #include "winsock2.h" 
  2. #define PORT 7777 
  3.  
  4. void CDlg::OnRecv() 
  5. WSADATA wsaData; 
  6. sockaddr_in local; 
  7. SOCKET listen_socket,msg_socket; 
  8. int retval; 
  9. char Buffer[1000]; 
  10. sockaddr_in from; 
  11. int fromlen; 
  12.  
  13. //初始化socket 
  14. if(WSAStartup(0x202,&wsaData) != 0) 
  15. AfxMessageBox("Socket初始化错误"); 
  16. WSACleanup(); 
  17. return
  18.  
  19. local.sin_family = AF_INET; 
  20. local.sin_addr.s_addr = INADDR_ANY; 
  21. local.sin_port = htons(PORT); 
  22.  
  23. //建立监听socket 
  24. listen_socket = socket(AF_INET,SOCK_STREAM,0); 
  25. if(listen_socket == INVALID_SOCKET) 
  26. AfxMessageBox("socket产生错误"); 
  27. WSACleanup(); 
  28. return
  29.  
  30. //绑定socket 
  31. if(bind(listen_socket,(sockaddr *)&local,sizeof(local)) != 0) 
  32. AfxMessageBox("socket绑定错误"); 
  33. WSACleanup(); 
  34. return
  35.  
  36. fromlen = sizeof(SOCKADDR); 
  37.  
  38. //socket监听 
  39. if(listen(listen_socket,5) != 0) 
  40. AfxMessageBox("监听出错"); 
  41. WSACleanup(); 
  42. return
  43.  
  44.  
  45. //循环接收连接 
  46. do
  47. if((msg_socket = accept(listen_socket,(LPSOCKADDR)&from,&fromlen))
  48.  == INVALID_SOCKET) 
  49. int i = WSAGetLastError(); 
  50. WSACleanup(); 
  51. AfxMessageBox("接收错误"); 
  52. return
  53. memset(Buffer,0,sizeof(Buffer)); 
  54. //循环接收消息 
  55. do
  56. if((retval = recv(msg_socket,Buffer,sizeof(Buffer),0)) < 0) 
  57. AfxMessageBox("接收失败"); 
  58. return
  59. while(retval != 0); 
  60. AfxMessageBox(Buffer); 
  61. closesocket(msg_socket); 
  62. }while(1); 
  63.  
  64. closesocket(listen_socket); 
  65. }  

以上代码在对话框中实现了一个最基本的消息发送功能,不足的地方是监听是做在主线程里面的,而且不能发送到内网。

(fanged)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201007/9892.html]
本文出处:fanged.ycool.com 作者:fanged
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容