zoukankan      html  css  js  c++  java
  • C++ 利用socket实现TCP,UDP网络通讯

           学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成TCP和UDP两种通讯模式的流程和代码分享一下,希望对大家多少能有点儿帮助,有什么说的不对的欢迎各位大神指正。

       TCP

          TCP是点对点的通讯模式,数据传输质量高,对于传输数据完整性要求高的情况一般用TCP,具体到vc++中,一般选用的是服务器/客户端模式,socket实现TCP通讯在服务器端一般分为以下几步:

    服务器端

          1.加载套接字库,加载套接字库的代码一般是固定的每次复制以下就OK。

          WORD wVersionRequested;
          WSADATA wsaData;
          int err;
          wVersionRequested=MAKEWORD(1,1);
          err=WSAStartup(wVersionRequested,&wsaData);
          if(err!=0)
        {
        return;
        }
          if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
       {

        WSACleanup();
         return;
       }

        2.创建套接字

        SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
        SOCKADDR_IN sockaddr;//创建一个地址结构体,对它的变量进行设置
        sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
        sockaddr.sin_family=AF_INET;
        sockaddr.sin_port=htons(6000);

        3.将套接字和IP地址和端口连接

        bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//绑定

        4.将套接字设置为监听模式

        listen(sockSrv,5);//设置为监听模式

        5.创建链接套接字

        SOCKADDR_IN sockclient;
        int len=sizeof(SOCKADDR);
        SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&sockclient,&len);//创建链接套接字

        6.发送和接收数据给客户端

        char sendBuf[100];

        send(sockCon,sendBuf,strlen(sendBuf)+1,0);
        char recvBuf[100];
        recv(sockCon,recvBuf,100,0);//发送接收函数

        7.关闭套接字

        closesocket(sockCon);//关闭套接字

    客户端

        1.加载套接字库

        与服务器端代码一样,直接复制就可以

        2.创建套接字

        SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
        SOCKADDR_IN sockaddr;
        sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
        sockaddr.sin_family=AF_INET;
        sockaddr.sin_port=htons(6000);

        3.套接字和IP地址和端口连接

        connect(sockClient,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));

        4.发送接收数据给服务器

        char recvBuf[100];
        recv(sockClient,recvBuf,100,0);
        printf("%s ",recvBuf);
        send(sockClient,"服务器你好",strlen("服务器你好")+1,0);

        5.关闭套接字

        closesocket(sockClient);
        WSACleanup();

    别忘了加上头文件#include<winsock2.h>同时要在link一下ws2_32.lib.然后就OK了。

    UDP

    udp是面向无连接的,广播式的数据传输机制,它的实时性高,输出传输的完整性没法保证,对于一些实时性要求高,完整性要求不高的情况采用UDP。

    服务器端

    1.加载套接字库

     啥也不说了,直接复制

    2.创建udp套接字

       SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);//这里主要与TCP模式下该参数的区别
       SOCKADDR_IN sockaddr;//创建一个地址结构体,对它的变量进行设置
       sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
       sockaddr.sin_family=AF_INET;
       sockaddr.sin_port=htons(6000);

    3.将套接字和IP地址和端口绑定

       bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//绑定

    4.接收数据

    这里的接收函数用的是recvfrom();

    5.关闭套接字

       closesocket(sock);

    客户端

    1.加载套接字库

     啥也不说了,直接复制

    2.创建UDP套接字

        SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
        SOCKADDR_IN sockaddr;
        sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
        sockaddr.sin_family=AF_INET;
        sockaddr.sin_port=htons(6000);

    3.发送数据

       sendto();//发送函数也有区别的

    4.关闭套接字

      closesocket(sockClient);
      WSACleanup();

    别忘了加上头文件#include<winsock2.h>同时要在link一下ws2_32.lib.然后就OK了。

  • 相关阅读:
    转:孙振耀谈人生(推荐)
    自绘按钮的实现
    数据结构知识
    Direct Show采集图像实例
    视觉跟踪
    改变对话框控件的颜色
    笔试题
    CBitmapButton的使用
    Rotor (SSCLI) 2.0 登场!
    Under the hood: 从Win32 SEH到CLI异常处理模型
  • 原文地址:https://www.cnblogs.com/ydjy/p/3942437.html
Copyright © 2011-2022 走看看