[C/C++]使用socket套接字的通信编程(包括MAKEWORD(2,2)使用等)

 

转过来的,留着备用,

 

附原文链接:

http://www.cnblogs.com/cailangwei/archive/2011/11/21/2258191.html

http://blog.sina.com.cn/s/blog_a74f39a201010sb3.html

1.

在WIN32平台上的WINSOCK编程都要经过下列步骤:
      定义变量->获得WINDOCK版本->加载WINSOCK库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载WINSOCK库->释放资源

     下面介绍WINSOCK C/S的建立过程:

     服务器                         客户端
________________________________________________
  初始化WSA                       初始化WSA
____________________________________________________
  建立一个SOCKET                  建立一个SOCKET
_____________________________________________________
  绑定SOCKET                      连接到服务器
_____________________________________________________
  在指定的端口监听                发送和接受数据
_____________________________________________________
  接受一个连接                     断开连接
______________________________________________________-
  发送和接受数据
___________________________________________________
  断开连接
__________________________________________________
 

 大家注意,在VC中进行WINSOCK编程时,需要引入如下两个库文件:WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以
可以用WINSOCK2.H);Ws2_32.lib(WINSOCK API连接库文件).
使用方式如下:
               #include <winsock.h>
           #pragma comment(lib,"ws2_32.lib")
  
   下面我们通过具体的代码演示服务器和客户端的工作流程:

首先,建立一个WSADATA结构,通常用wsaData
WSADATA wsaData;

然后,调用WSAStartup函数,这个函数是连接应用程序与winsock.dll的第一个调用.其中,第一个参数是WINSOCK 版本号,第二个参数是指向
WSADATA的指针.该函数返回一个INT型值,通过检查这个值来确定初始化是否成功.调用格式如下:WSAStartup(MAKEWORD(2,2),&wsaData),其中
MAKEWORD(2,2)表示使用WINSOCK2版本.wsaData用来存储系统传回的关于WINSOCK的资料.

if(iResuit=WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
     printf("WSAStartup failed:%d",GetLastError());   //返回值不等与0,说明初始化失败

     if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
         printf( "bind() failed.\n" );
         closesocket(server);
         return;
     }
    
                                                                               // 监听 socket
     if ( listen( server, 1 ) == SOCKET_ERROR )
         printf( "Error listening on socket.\n");

                                                                                 // 接受连接
     SOCKET AcceptSocket;

     printf( "Waiting for a client to connect...\n" );
     while (1) {
         AcceptSocket = SOCKET_ERROR;
         while ( AcceptSocket == SOCKET_ERROR ) {
             AcceptSocket = accept( server, NULL, NULL );
         }
         printf( "Client Connected.\n");
         server = AcceptSocket;
         break;
     }
    
                                                                                      // 发送接受数据
     int bytesSent;
     int bytesRecv = SOCKET_ERROR;
     char sendbuf[32] = "Server: Sending Data.";
     char recvbuf[32] = "";
    
     bytesRecv = recv( server, recvbuf, 32, 0 );
     printf( "Bytes Recv: %ld\n", bytesRecv );
    
     bytesSent = send( server, sendbuf, strlen(sendbuf), 0 );
     printf( "Bytes Sent: %ld\n", bytesSent );

     return;



2.  C#基于Socket的CS模式的完整例子
基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,
首先设计服务器。打开VS2008,在D:\C#\ch17目录下建立名为SocketServer的Windows应用程序。打开工程,往当前窗体中添加控件</p><p>
接下来开始运用前面的知识设计服务器,主要分为以下步骤。
(1)首先是对一些命名空间的包含,包括System.Net、System.Net.Sockets、System.IO和System.Threading。然后定义一系列的全局变量,如下所示。
(2)接下来是设计客户端连接的管理,主要包括服务器与客户端之间的连接和收发数据问题,把它们放在一个函数Communication里,如下所示。

 

public void Communication()
 {
     while (true)
     {
         try
         {
             cSocket = s.Accept();                   //用cSocket来代表该客户端连接
             if (cSocket.Connected)                  //测试是否连接成功
             {
                 ns = new NetworkStream(cSocket);  //建立网络流,便于数据的读取
                 sr = new StreamReader(ns);         //实例化流读取对象
                 sw = new StreamWriter(ns);         //实例化写入流对象
                 test();                               //从流中读取
                 sw.WriteLine("收到请求,允许连接"); //向流中写入数据
                 sw.Flush();                           //清理缓冲区
             }
             else
             {
                 MessageBox.Show("连接失败");
             }
         }
         catch (SocketException ex)
         {
             MessageBox.Show(ex.Message);           //捕获Socket异常
         }
         catch (Exception es)
         {
             MessageBox.Show("其他异常" + es.Message);      //捕获其他异常
         }
     }
 }
 //以下代码的用法在第16章有关线程的用法时曾提到过,主要用于从当前线程操作主线程中的控件,这里就不在赘//述
 public void send()
 {
     lbInfo.Items.Add(sr.ReadLine()+"\n");
 }
 public void test()
 {
     SetTextCallback stcb = new SetTextCallback(send);
     Invoke(stcb);
 }


 

(3)定义好与客户端的连接后,接下来需要利用线程来启动,双击“启动服务器”按钮,添加如下代码。
 (4)最后在关闭服务器窗口的时候,还应该关闭线程和当前Socket连接,代码如下所示。
 

至此,服务器就设计完了,下面接着看客户端。
基于Socket客户端实现打开VS2008,在D:\C#\ch17目录下建立名为SocketClient的Windows应用程序。打开工程,往当前窗体中添加控件,

 

客户端的设计主要分为以下步骤。
(1)首先要做的工作还是要引用一些命名空间,如下所示

  然后定义一系列的全局变量,如下所示。  

2)双击“发送”按钮,添加如下代码。

(3)最后,关闭Socket连接,释放资源,可以直接在窗体的FormClosed事件中进行,如下所示。
s.Shutdown(SocketShutdown.Both);
s.Close();
至此,服务器和客户端已经全部设计完毕,下面看运行效果。
基于Socket的C/S实例的运行首先,启动服务器程序,单击“启动服务器”按钮,如图17-4所示。接着再启动客户端,并在textBox1输入数据(中英文皆可),多次单击“发送”按钮,如图17-5所示。
此时,服务器的状态如图17-6所示。
收到客户端发送的数据
从图17-6中可以看出,此时服务器已经收到来自客户端的数据,而图17-5中显示客户端也收到了来自服务器的回馈消息。此外,本例还能实现多个客户端向一个服务器同时收发数据,并已经在三台计算机(一个服务器和两个客户端)上测试通过。本例只是实现了服务器与客户端最简单的数据传输,读者如果有兴趣可以在此基础上再添加其他功能,比如可以利用前面讲的数据库知识,在服务器端写个用户登录验证,让客户端通过验证后才能收发数据等。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值