zoukankan      html  css  js  c++  java
  • windows下网络编程TCP

    转载 

    sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);

    基于TCP的socket编程

    服务器端编程的步骤:

    1:加载套接字库,创建套接字(WSAStartup()/socket());

    2:绑定套接字到一个IP地址和一个端口上(bind());

    3:将套接字设置为监听模式等待连接请求(listen());

    4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

    5:用返回的套接字和客户端进行通信(send()/recv());

    6:返回,等待另一连接请求;

    7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

    客户端编程的步骤:

    1:加载套接字库,创建套接字(WSAStartup()/socket());

    2:向服务器发出连接请求(connect());

    3:和服务器端进行通信(send()/recv());

    4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

    第一步: 加载/释放Winsock库:

    1.加载方法:

    WSADATA wsaData;
      WORD wVersionRequested = MAKEWORD(2, 2);
      /*初始化socket资源*/
      if (WSAStartup(wVersionRequested, &wsaData) != 0)
          return;
      //代表失败
      if (LOBYTE(wsaData.wVersion) != 2 ||
      HIBYTE(wsaData.wVersion) != 2)
      {
                                   
          WSACleanup();  
          return;
      }

    2.释放方法:

    WSACleanup();

    第二步: 构造SOCKET:

    1.服务端:构造监听SOCKET,流式SOCKET.
       SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)

    2.客户端:构造通讯SOCKET,流式SOCKET.
    SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

    第三步:配置监听地址和端口:

    1.服务端: SOCKADDR_IN serverAddr
       ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
       serverAddr.sin_family = AF_INET;
       serverAddr.sin_port = htons(1234);           /*本地监听端口:1234*/
       serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/

    第四步:   绑定SOCKET:

    1.服务端:绑定监听SOCKET.
      bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

    第五步: 服务端/客户端连接:

    1.服务端:等待客户端接入.
       SOCKET Command_Sock = accept(Listen_Sock, ...)

    2.客户端:请求与服务端连接.
    int ret = connect(Client_Sock, ...)

    第六步: 收/发数据:

    1.服务端:等待客户端接入.char buf[1024].
        接收数据:recv(Command_Sock,buf, ...)

        发送数据:send(Command_Sock,buf, ...)

    2.客户端:请求与服务端连接.char buf[1024].
        发送数据:send(Client_Sock,buf, ...)

        接收数据:recv(Client_Sock,buf, ...)

    第七步: 关闭SOCKET:

    1.服务端:关闭SOCKET.
       closesocket(Listen_Sock)
    closesocket(Command_Sock)

    2.客户端:关闭SOCKET.
    closesocket(Client_Sock)

    服务器代码

    #include "stdafx.h"
    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")
    int _tmain(int argc, _TCHAR* argv[])
    {
        //初始化socket资源
        WSADATA wsa;
        if (NOERROR != WSAStartup(MAKEWORD(1, 1), &wsa))
        {
            return 1; //代表失败
        }
        SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        sockaddr_in addrServer;
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");
        addrServer.sin_port = htons(24583);
        bind(sockServer, (SOCKADDR *)&addrServer, sizeof(addrServer));
        listen(sockServer, SOMAXCONN);
    
        SOCKET AcceptSocket = accept(sockServer, NULL, NULL);
        cout << "连接OK" << endl;
        send(AcceptSocket, "zhao", sizeof("zhao"), 0);
        cout << "服务器--->客户端" << endl << "发的消息为:" << "zhao" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }

    客户端代码

    #include "stdafx.h"
    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")
    #define DEFAULT_BUFLEN 512
    int _tmain(int argc, _TCHAR* argv[])
    {
        //初始化socket资源
        WSADATA wsa;
        if (NOERROR != WSAStartup(MAKEWORD(1, 1), &wsa))
        {
            return 1; //代表失败
        }
        SOCKET sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        sockaddr_in addrServer;
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");
        addrServer.sin_port = htons(24583);
        connect(sockClient, (SOCKADDR *)&addrServer, sizeof(addrServer));
        char recvbuf[DEFAULT_BUFLEN] = { 0 };
        recv(sockClient, recvbuf, DEFAULT_BUFLEN, 0);
        cout << "客户端接收到的消息为: " << recvbuf << endl;
    
        system("pause");
        WSACleanup();
        return 0;
    }
    111
  • 相关阅读:
    CVSps 3.8 发布,CVS 资料库更改收集
    Cobra WinLDTP 3.0 发布,GUI 自动化测试
    SolusOS 2 Alpha 6 发布,桌面 Linux 发行
    微软 Windows Phone 8 原创应用大赛起航
    JAVA削足适履适应RESTful设计
    如何撰写编程书籍
    Synbak 2.1 发布,系统备份工具
    LibreOffice 4.0 RC1 发布,支持火狐兼容主题
    Rails 3.2.11 发布,修复关键安全问题
    haveged 1.7 发布,随机数生成器
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/9067049.html
Copyright © 2011-2022 走看看