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

yizhihongxing

以下是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语言实现病例管理系统攻略 1. 简介 病例管理系统是医院或诊所等医疗机构常用的一种信息管理系统,通过该系统能够快速有效地管理病人的基本信息、病史以及药物处方等。这需要使用到C语言的数据类型、字符串操作等基本操作,实现起来比较简单。 2. 实现流程 2.1 确定需求 首先,我们需要明确病例管理系统需要具备哪些功能,如:添加病例、删除病例、修改病例、查询病例等…

    C 2023年5月23日
    00
  • 如何用C语言添加矩阵

    添加矩阵是C语言中常见的任务之一。以下是一些基本的步骤: 1. 定义矩阵 在C语言中,可以使用二维数组来定义矩阵。例如,以下代码定义了一个3×3的矩阵: int matrix[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} }; 2. 显示矩阵 可以使用循环来遍历矩阵中的所有元素,并将它们打印出来。例如,以下代码使用嵌套循环来遍历矩阵…

    C 2023年5月9日
    00
  • C++实现简单的学生管理系统

    C++实现学生管理系统攻略 1. 确定系统功能 学生管理系统有很多功能,有录入学生信息、显示学生信息、修改学生信息、删除学生信息等。确定系统功能是实现该系统的第一步。本系统以录入、显示、修改、删除学生信息为功能点展开。 2. 设计学生类 学生信息的属性有:学号、姓名、性别、出生年月、成绩。因此,我们可以设计一个学生类 Student,并在其中定义相应的属性和…

    C 2023年5月22日
    00
  • c++ 如何实现线程注入

    C++如何实现线程注入是一个相对复杂和高级的主题,需要一定的专业知识和经验,操作不当可能会对系统和应用程序造成不可预知的损害。下面是一个简单的线程注入攻略,供参考。 前置条件及准备工作 在进行线程注入操作之前,需要考虑以下几点: 需要注入的进程必须是完全信任的,否则注入操作有可能会被拒绝或失败。 需要了解目标进程的架构、平台和权限等信息,以确定注入方式和实现…

    C 2023年5月23日
    00
  • C语言实现推箱子项目

    下面是“C语言实现推箱子项目”的完整攻略: 一、项目介绍 推箱子是一款经典的游戏,这里将通过C语言来实现这个项目。游戏的主要玩法是玩家控制一个人物推着多个箱子走到特定的位置。要求箱子能够被推到指定的位子,不能被推到障碍物上,也不能被推到死路上。本项目主要使用C语言中的字符数组和指针操作等相关知识。 二、实现过程 游戏地图设计 游戏地图是一个二维数组。玩家需要…

    C 2023年5月23日
    00
  • Java编程中的vector类用法学习笔记

    Java编程中的Vector类用法学习笔记 Vector类概述 在Java中,Vector类是一种线程安全的动态数组,可以自动调整大小。它的用法类似于ArrayList,但是Vector是同步的,因此比ArrayList的访问开销更大。Vector实现了List接口,并且可以通过下标访问,插入和删除元素。 Vector类的基本用法 创建Vector对象 im…

    C 2023年5月22日
    00
  • Jquery通过JSON字符串创建JSON对象

    当使用jQuery进行Ajax请求时,响应得到的数据通常是一个JSON字符串,为了使获得的JSON数据更易于操作,需要将其转化为JSON对象。下面是实现此过程的完整攻略: 1. 使用parseJSON方法 parseJSON方法可以将JSON字符串转化为JSON对象。 var jsonStr = ‘{"name":"Emma&q…

    C 2023年5月23日
    00
  • C语言实现常见进制转换的示例代码

    下面是C语言实现常见进制转换的完整攻略: 一、关于进制转换 计算机中数据的存储最终都是以二进制的形式保存在计算机中的,不同进制只是将二进制转换为对应的进制。又因为进制之间符号位不同,例如二进制中符号位是0或1,因此在不同进制之间转换时需要注意符号位的问题。在C语言中,通常用以下4种进制进行转换:2进制、8进制、10进制和16进制。 有关进制转换的详细内容,可…

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