zoukankan      html  css  js  c++  java
  • WinSock2.0通信的一个例子(基于VC++6.0开发测试)

    实验目的:

    掌握Winsock2.0套接字编程技术的基本方法。

    实验要求:

    运用TCP/IP Winsock2.0套接字编程技术,使用VC编写一个面向连接通信的服务端程序与客户端程序,服务器先与端口3000绑定,

    然后等待客户连接,连接成功后就可与客户端互相收、发信息。交互中,通信任一方只要发送 bye, 通信过程便自动结束。

    服务端:

    #include <conio.h>
    #include <stdio.h>
    #include <winsock2.h>
    
    #pragma comment(lib, "Ws2_32.lib")
    
    int main(int, char **)
    {
        struct sockaddr addr;
        int recvLen, errCode;
        
        char msg[255] = {0};
        SOCKET sock, sersock;
    
        WORD wVersionRequested;
        WSADATA wsaData;
        LPSTR messageBuffer = NULL;
    
        SetConsoleTitle("服务端");
    
        wVersionRequested = MAKEWORD(2, 0);
        errCode = WSAStartup(wVersionRequested, &wsaData);
    
        if (errCode)
        { 
            printf("没有Windows Socket动态库!
    ");
            return WSAGetLastError();
        }
    
        if (LOBYTE(wsaData.wVersion) != 2 || //不是Winsock 2.0
            HIBYTE(wsaData.wVersion) != 0)
        {
            printf("需要Windows Socket 2!
    ");
            WSACleanup();
            return WSAGetLastError();
        }
    
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
    
        if (sock == INVALID_SOCKET)
        { 
            printf("不能创建Socket!
    ");
            getch();
            WSACleanup(); 
            return 0;
        }
    
        ((sockaddr_in *)&addr)->sin_family = AF_INET;
        
        ((sockaddr_in *)&addr)->sin_port = htons(3000);
    
        ((sockaddr_in *)&addr)->sin_addr.s_addr = inet_addr("127.0.0.1");
    
        bind(sock, &addr, sizeof(addr));
    
    
        listen(sock, 1);
    
    
        printf("等待客户连接!
    ");
        recvLen = sizeof(addr);
        sersock = accept(sock, &addr, &recvLen);
    
        if (sersock == INVALID_SOCKET)
        {
            errCode = WSAGetLastError();
    
            size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER 
                | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPSTR)&messageBuffer, 0, NULL);
    
            printf("%s
    ", messageBuffer);
            free(messageBuffer);
            
            getch();
            closesocket(sock);
            WSACleanup();
            return 0;
        }
    
        printf("有客户连接!
    输入bye通信结束
    ");
    
    
        do
        {
            printf("
    等待客户端输入信息......");
            recvLen = recv(sersock, msg, 200, 0);
            printf("
    客户端:%s", msg);
        
            if (!strcmp(msg, "bye"))
                break;
            printf("
    服务器:");
            gets(msg);
            
        
            send(sersock, msg, strlen(msg) + 1, 0);
    
        } while (strcmp(msg, "bye"));
    
        closesocket(sersock);
        closesocket(sock);
        printf("
    
    会话结束,按任一键返回
    ");
        getch();
        WSACleanup();
        return 0;
    }

    客户端:

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
    
    #pragma comment(lib, "Ws2_32.lib")
    
    int main(int, char **)
    {
        SOCKET sock;
        struct sockaddr addr;
        int errCode;
        char msg[255] = {0};
    
        WORD wVersionRequested;
        WSADATA wsaData;
    
        SetConsoleTitle("客户端");
        wVersionRequested = MAKEWORD(2, 0);
        errCode = WSAStartup(wVersionRequested, &wsaData);
    
        if (errCode)
        { 
            printf("没有Windows Socket动态库!
    ");
            return WSAGetLastError();
        }
    
        if (LOBYTE(wsaData.wVersion) != 2 || 
            HIBYTE(wsaData.wVersion) != 0)
        {
            printf("需要Windows Socket 2!
    ");
            WSACleanup(); 
            return WSAGetLastError();
        }
    
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
    
        if (sock == INVALID_SOCKET)
        { 
            printf("不能创建Socket!
    ");
            getch();
            WSACleanup(); 
            return WSAGetLastError();
        }
    
        ((sockaddr_in *)&addr)->sin_family = AF_INET;
    
        ((sockaddr_in *)&addr)->sin_addr.s_addr = inet_addr("127.0.0.1");
    
        ((sockaddr_in *)&addr)->sin_port = htons(3000);
    
        printf("与服务器连接...!
    ");
        
        errCode = connect(sock, (sockaddr *)&addr, sizeof(addr));
        if (errCode == SOCKET_ERROR)
        { 
            printf("连接失败!
    ");
            getch();
            WSACleanup();
            return 0;
        }
    
        printf("成功连接到服务器127.0.0.1!
    若输入bye则通信结束
    ");
    
    
        do
        {
            printf("
    
    客户端:");
            gets(msg);
        
            send(sock, msg, strlen(msg) + 1, 0);
    
            if (!strcmp(msg, "bye")) break;
    
            printf("等待服务器响应......
    ");
    
            recv(sock, msg, 200, 0);
    
            printf("服务器:%s", msg);
    
        } while (strcmp(msg, "bye"));
    
        closesocket(sock);
        printf("
    会话结束,按任一键返回
    ");
        getch();
        WSACleanup();
        return 0;
    }

    运行效果:

    此为学校实验题目:word排版请用http://www.planetb.ca/syntax-highlight-word

    Winsock2.0相关参考网站,拥有大量示例代码:https://www.tenouk.com/

  • 相关阅读:
    js的基本数据类型有哪些?
    页面优化的方式有哪些?
    为什么要用rem
    sass开发过程中遇到的几个坑
    js事件监听
    js数组去重的方法
    什么是怪异盒模型
    Cookie SameSite属性介绍及其在ASP.NET项目中的应用
    HttpServlet在第一个Servlet程序中的知识点
    Myeclipse 2017 创建第一个servlet步骤
  • 原文地址:https://www.cnblogs.com/passedbylove/p/12016114.html
Copyright © 2011-2022 走看看