C语言WinSock学习笔记第2/2页

以下是C语言WinSock学习笔记第2/2页的完整攻略:

概述

WinSock(Windows套接字)是一组用于网络编程的API,最初由Microsoft开发并在Windows95上引入。WinSock API使得开发人员可以使用C语言编写网络应用程序,如web浏览器和FTP客户端等。本文将介绍如何使用WinSock API进行网络编程,构建客户端和服务器程序。

客户端

在WinSock中,客户端程序的基本工作流程如下:

  • 初始化WinSock库
  • 创建套接字
  • 连接到服务器
  • 从服务器接收数据(如果需要)
  • 关闭套接字和WinSock库

下面是一个简单的示例,它演示了如何使用WinSock API编写一个s客户端程序:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

int main() {
    WSADATA wsaData;
    SOCKET ConnectSocket;
    struct sockaddr_in serv_addr;
    char receiveBuffer[256];
    int iResult;
    int receiveSize = 256;

    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(80);
    serv_addr.sin_addr.s_addr = inet_addr("74.125.24.106");

    iResult = connect(ConnectSocket, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    if (iResult == SOCKET_ERROR) {
        printf("connect failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    iResult = recv(ConnectSocket, receiveBuffer, receiveSize, 0);
    if (iResult > 0) {
        printf("Received: %s\n", receiveBuffer);
    } else if (iResult == 0) {
        printf("Connection closed\n");
    } else {
        printf("recv failed with error: %d\n", WSAGetLastError());
    }

    closesocket(ConnectSocket);
    WSACleanup();

    return 0;
}

上述代码将建立与Google首页的TCP连接,并将收到的数据打印到控制台上。

服务器端

在WinSock中,服务器程序的基本工作流程如下:

  • 初始化WinSock库
  • 创建套接字,并将其与一个IP地址和端口号绑定
  • 在套接字上侦听传入的连接请求
  • 接受连接请求
  • 从客户端接收数据(如果需要)
  • 处理客户端请求
  • 关闭连接和套接字,并清除WinSock库

下面是一个简单的示例,它演示了如何使用WinSock API编写一个UDP服务器程序:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

int main() {
    WSADATA wsaData;
    SOCKET ListenSocket;
    struct sockaddr_in serv_addr, cli_addr;
    char receiveBuffer[256];
    int iResult;
    int receiveSize = 256;
    int cli_len;

    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if(iResult) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(ListenSocket == INVALID_SOCKET) {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    memset((char *)&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(9000);
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    iResult = bind(ListenSocket, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    if(iResult == SOCKET_ERROR) {
        printf("bind failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    while(1) {
        printf("Waiting for datagrams...\n");
        memset((char *)&cli_addr, 0, sizeof(cli_addr));
        iResult = recvfrom(ListenSocket, receiveBuffer, receiveSize, 0, (struct sockaddr *)&cli_addr, &cli_len);
        if(iResult == SOCKET_ERROR) {
            printf("recvfrom failed with error: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        } else {
            receiveBuffer[iResult] = '\0';
            printf("Received datagram from client: %s\n", receiveBuffer);

            iResult = sendto(ListenSocket, "Hello from server!", 19, 0, (struct sockaddr *)&cli_addr, sizeof(cli_addr));
            if(iResult == SOCKET_ERROR) {
                printf("sendto failed with error: %d\n", WSAGetLastError());
                closesocket(ListenSocket);
                WSACleanup();
                return 1;
            } else {
                printf("Sent %d bytes to client\n", iResult);
            }
        }
    }

    closesocket(ListenSocket);
    WSACleanup();

    return 0;
}

上述代码将侦听UDP数据报,将收到的数据报打印到控制台上,并向客户端发送一个字符串"Hello from server!"。

希望以上内容对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言WinSock学习笔记第2/2页 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言声明函数指针

    C语言中,函数指针是非常重要的概念之一,它可以用于动态地调用函数、传递在运行时确定的函数等。本文将详细讲解如何在C程序中声明函数指针。 声明函数指针的语法 函数指针的语法如下: return_type (*pointer_name)(arg_type1, arg_type2, …, arg_typeN); 其中,return_type 表示函数返回值的类…

    C 2023年5月9日
    00
  • Redhat 6.2 下 oracle 11g R2的安装详解第2/2页

    让我来详细讲解 “Redhat 6.2 下 oracle 11g R2的安装详解第2/2页” 的完整攻略。 前言 安装 Oracle 数据库是一个比较复杂的过程,需要仔细阅读并按照官方文档或者其他详细攻略一步一步操作。本攻略是基于 Redhat 6.2 系统,讲解 Oracle 11g R2 的安装步骤。 步骤 准备环境 在安装 Oracle 之前,需要安装…

    C 2023年5月23日
    00
  • C语言如何在指针中隐藏数据详解

    一、什么是C语言指针的隐藏数据 在C语言中,指针可以用来访问变量在内存中的地址。一般情况下,我们使用指针来直接访问、修改该变量的值。但是,指针本身也是一个变量,也可以被赋值,并被存储到内存中。因此,我们可以通过将数据(例如,一个结构体)存储到指针中来隐藏数据。 二、如何在指针中隐藏数据 我们可以使用结构体类型和typedef定义指针类型,以便在指针中保存结构…

    C 2023年5月22日
    00
  • JS中的Error对象及使用JSON.stringify()序列化Error问题

    JS中的Error对象是用于处理和抛出错误的一种内置类型,它有以下几个属性: name:Error对象的名称,默认为“Error”。 message:错误消息,通常是人类可读的信息。 stack:当前调用栈的字符串表示,用于调试目的。 当发生错误时,可以使用以下语法创建一个Error对象: throw new Error(‘错误消息’); 这会把错误消息作为…

    C 2023年5月23日
    00
  • C语言深入讲解函数参数的使用

    C语言深入讲解函数参数的使用 函数是C语言中的重要概念,它使得代码更加模块化和可复用。函数参数则是函数与函数之间数据传递的途径之一,它能够让我们灵活地使用函数。本文将会深入讲解C语言中函数参数的使用。 函数参数的传递方式 C语言中,函数参数的传递方式有两种:值传递和指针传递。 值传递 值传递即将函数调用时实参的值传递给形参,此时形参和实参是两个独立的变量,形…

    C 2023年5月23日
    00
  • 通过VS中的数据源选择对话框简单实现数据库连接配置

    通过VS中的数据源选择对话框,可以简单地实现数据库连接配置。下面将分为以下几个步骤来介绍如何实现: 1. 打开Server Explorer 在Visual Studio的视图菜单中选择“Server Explorer”或者使用快捷键“Ctrl+\,Ctrl+S”来打开Server Explorer。 2. 添加数据源 在Server Explorer中右键…

    C 2023年5月23日
    00
  • 浅谈c++ hook 钩子的使用介绍

    浅谈C++ Hook 钩子的使用介绍 1. 什么是Hook钩子? Hook钩子是一种可以监控和修改系统、进程或应用程序行为的技术。在Windows操作系统下,可以通过Hook技术对API函数进行钩取,实现拦截API调用并进行自定义的处理。 2. Hook钩子的类型 在Windows操作系统中,可以使用以下两种类型的Hook钩子: 2.1 系统级钩子 系统级钩…

    C 2023年5月30日
    00
  • C语言实现天气信息管理系统

    C语言实现天气信息管理系统攻略 系统需求 天气信息管理系统需要实现以下功能: 添加城市天气信息 显示城市天气信息 修改城市天气信息 删除城市天气信息 保存天气信息到文件 从文件中读取天气信息 实现步骤 步骤一:定义结构体 首先,需要定义一个结构体来存储城市天气信息。 typedef struct { char city[20]; int max_temper…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部