zoukankan      html  css  js  c++  java
  • 基于TCP/IP协议的C++网络编程(API函数版)

    源代码:http://download.csdn.net/detail/nuptboyzhb/4169959

    基于TCP/IP协议的网络编程

    定义变量——获得WINSOCK版本——加载WINSOCK——初始化——创建套接字 ——设置套接字选项——关闭套接字——卸载WINSOCK——释放所有资源

    整个程序架构分为两大部分,服务器端客户端。

    服务器SOCKET程序流程:

    socket()→bind()→listen→accept()→recv()/send()→closesocket()

    客户端:

    socket→bind()→connect()→send()/recv()→closesocket()

     

    编程举例:

    约定发送消息的格式为如下结构体:

    typedef struct

    {

             int ID;

             char data[255];

    }TcpMessage;

    应用程序的头文件如下:

    #include <winsock2.h>

    #pragma comment(lib,"ws2_32")

    #include <stdio.h>

    端口号为:4500

    服务器端:

    1、  初始化:

             WSADATA wsaData;

        WORD sockVersion = MAKEWORD(2, 2);

             if(WSAStartup(sockVersion, &wsaData) != 0)

                       return 0;

    2、  创建套接字:

             SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

             if(sListen == INVALID_SOCKET)

    {

    printf("socket error ");

    return 0;

    }

    3、  使套接字和本地地址绑定

    // sockaddr_in结构中装入地址信息

             sockaddr_in sin;

             sin.sin_family = AF_INET;

             sin.sin_port = htons(4500); // htons函数将主机的无符号短整形数转换成网络

             //字节顺序

             sin.sin_addr.S_un.S_addr = INADDR_ANY;

    if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

             {

                       printf(" bind error ");

                       closesocket(sListen);

                       return 0;

             }

    4、监听端口

             if(listen(sListen, 5) == SOCKET_ERROR)

             {

                       printf("listen error ");

                       closesocket(sListen);

                       return 0;

             }

    5、等待接受连接,(如无连接,一直等待)

    SOCKET sClient;//用于保存accept返回的套接字

    sClient = accept(sListen,0,0);//accept函数调用失败则继续等待连接。

    if(sClient == INVALID_SOCKET)

    {

                                printf("accept() error");

             }

    6、用第5步中accept函数返回的套接字进行收发通信

     6.1、接收:(如果没有接到,会等待!

          TcpMessagerevData;//定义接收消息的结构体变量

          int ret=recv(sClient,(char *)&revData,sizeof(revData),0);

          if(ret>0)//说明,收到字节

          {

             switch (revData.ID)//对不同的ID,可以有不同的反应

    {

       case 1:

       ……..

    case 2:

    ……..

    }

    }

     6.2、发送:

          TcpMessage sendData;

               memset((char*)&sendData,0,sizeof(sendData));//初始化为0

          sendData.ID=1;//ID成员变量赋值

          strcpy(sendData.data," ..要发送的字符信息 ");

          if(send(sClient,(char*)&sendData,sizeof(sendData),0)==SOCKET_ERROR)

               {

                       char error[10];

                       int errorcode=WSAGetLastError();

                       itoa(errorcode,error,10);

                       MessageBox(NULL,error,"发送失败,错误码为:",MB_OK);

                       printf("send error!");

               }

    7、关闭

             closesocket(sClient);//accept生成的套接字

             closesocket(sListen);//服务端套接字

             WSACleanup();

    客户端

    1、   初始化

    WSADATA wsaData;

    WORD sockVersion = MAKEWORD(2, 2);

           if(WSAStartup(sockVersion, &wsaData) != 0)

                            return 0;

    2、   创建套接字

    SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

              if(sClient == INVALID_SOCKET)

              {

                       printf("socket error ");

                       return 0;

           }

    3、   使套接字和本地地址绑定

    // sockaddr_in结构中装入服务器端地址信息

              sockaddr_in servAddr;

              servAddr.sin_family = AF_INET;

              servAddr.sin_port = htons(4500);// htons函数将主机的无符号短整形数转换成网络

              //字节顺序,4500端口为要连接服务器端的端口

           servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服务器端ip

    4、   连接服务器

              if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)

              {

                       printf("connect error ");

                       closesocket(sClient);

                       return 0;

           }

    //注意,要先把服务器打开,否则连接失败

    5、   收发通信

    sendrecv函数,这一点和服务器端一样

    6、   关闭

    closesocket(sClient);//客户端只有一个连接套接字

              WSACleanup();

  • 相关阅读:
    内置对象 和 DropDownList时间年月日的三级联动
    复合控件 ispostback 跨页面传值
    webform简单控件和Repeater的使用
    初步认识ASP.NET WebForm
    WinForm Timer控件,三级联动[省,市,区]
    进程 线程 用户控件
    窗体容器MDI
    对话框控件 MessageBox.Show()用法补充 打开新窗体的3中模式
    winform窗体移动和阴影API
    PS学习笔记
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501264.html
Copyright © 2011-2022 走看看