【tcp-ip学习总结】基础UDP实现的简单通信功能小程序

环境:VS2013

#include<Winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")

#define DEFAULT_PORT 8888
#define BUFFER_LENGTH 1024

void main()
{
    int iPort = DEFAULT_PORT;
    WSADATA wsaData;//协议栈
    SOCKET sSocket;//服务端的socket
    int iLen;//客户端地址长度
    int iSend;//发送数据的长度
    int iRecv;//接受数据的缓冲区长度
    char sendBuf[] = "Hello! I am server";//服务端要发送的字符串
    char recvBuf[BUFFER_LENGTH];//服务器端接受数据的缓冲区
    struct sockaddr_in ser, cli; //本地地址和客户地址
    printf("-----------------\n");
    printf("Server waiting\n");
    printf("-----------------\n");

    //加载协议栈
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("Failed to load Winsock.\n");
        return;
    }

    //创建服务器端的socket套接口
    sSocket = socket(AF_INET, SOCK_DGRAM, 0);
    if (sSocket == INVALID_SOCKET)
    {
        printf("socket(Failed:%d\n)", WSAGetLastError);
        return;
    }
    //初始化服务器端的地址与端口号
    ser.sin_family = AF_INET;
    ser.sin_port = htons(8888);//服务器端监听的端口号
    ser.sin_addr.s_addr = htonl(INADDR_ANY);//服务端的端口地址

    //将服务器端socket和服务器的端ip地址和端口号绑定,
    if (bind(sSocket, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR)
    {
        printf("bind() Failed:%d\n", WSAGetLastError());
        return;
    }

    iLen = sizeof(cli);
    memset(recvBuf, 0, sizeof(recvBuf));//将接收缓冲区内容全部初始化为0

    while (1)
    {
    //从服务器端套接口中接收数据,并把客户端的地址情况保存到cli上面
        iRecv = recvfrom(sSocket, recvBuf, BUFFER_LENGTH, 0,(SOCKADDR*)&cli,&iLen);
        if (iRecv == SOCKET_ERROR)
        {
            printf("recvfrom()Faild;%d\n", WSAGetLastError());
            break;
        }
        else if (iRecv == 0)
        {
            break;
        }
        else
        {
            printf("recvfrom():%s\n", recvBuf);
            printf("accepted client ip[%s], port[%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port));
        }
    //向客户端发送数据
        iSend = sendto(sSocket, sendBuf, sizeof(sendBuf), 0, (SOCKADDR*)&cli, sizeof(cli));
        if (iSend == SOCKET_ERROR)
        {
            printf("sendto() Faild:%d\n", WSAGetLastError());
            printf("----------\n");
            break;
        }
        else if (iSend == 0)
            break;
        else
        {
            printf("sendto() succeeded\n");
            printf("-=---------\n");
        }
    }
    closesocket(sSocket);//关闭套接口
    WSACleanup();//清空协议栈
}

client.c

#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
    WSADATA wsaData;//协议栈
    SOCKET sClient;//客户端套接口
    struct sockaddr_in ser;//客户端地址
    int iPort = 8888;
    int iLen;//客户端地址长度
    int iSend;
    int iRecv;
    char sendBuf[1024];//发送数据缓冲区
    char recvBuf[1024];//接收数据缓冲区

    memset(recvBuf, 0, sizeof(recvBuf));//把接收数据缓冲区初始化为0
    //加载协议栈
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("Failed to load Winsock\n");
        return;
    }
    //初始化客户端地址情况
    ser.sin_family =  AF_INET;
    ser.sin_port = htons(8888);
    ser.sin_addr.s_addr = inet_addr("127.0.0.1");
    //创建客户端套接口
    sClient = socket(AF_INET, SOCK_DGRAM, 0);
    if (sClient == INVALID_SOCKET)
    {
        printf("socket() Faild %d\n", WSAGetLastError());
        return;
    }

    iLen = sizeof(ser);

    while (1) {
        printf_s("请输入要发送的消息:");
        gets_s(sendBuf, 1024);
        //开始发送数据
        iSend = sendto(sClient, sendBuf, sizeof(sendBuf), 0, (struct sockaddr*)&ser, iLen);
        if (iSend == SOCKET_ERROR)
        {
            printf("sendto()faild %d", WSAGetLastError());
            return;
        }
        else if (iSend = 0)
        {
            return;
        }
        else {
            printf("sendto() succeeded\n");

        }
        //接收数据
        iRecv = recvfrom(sClient, recvBuf, sizeof(recvBuf), 0, (struct sockaddr*)&ser, &iLen);
        if (iRecv == SOCKET_ERROR)
        {
            printf("recvfrom() faild %d\n", WSAGetLastError());
            return;
        }
        else if (iRecv == 0)
            return;
        else {
            printf("recvfrom() %s", recvBuf);
            printf("-----------------\n");
        }
    }

    closesocket(sClient);//关闭套接口
    WSACleanup();//清空协议栈
}
时间: 2024-12-13 10:08:03

【tcp-ip学习总结】基础UDP实现的简单通信功能小程序的相关文章

TCP/IP网络协议基础知识集锦[转]

引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP协议簇是由OSI七层模型发展而来的,之所以存在OSI互联参考模型主要有以下几点好处: 1.用于解决不同厂商的设备互联问题:即兼容性考虑; 2.层次化结构独立性强;可扩展性强; 3.统一标准可以方便学习; TCP/IP模型 TCP/IP模型与OSI模型的相互关系如下图所示: 注释 1.应用层:与OSI的应用层.表示层.会话层相对应,主要作用是

[转] TCP/IP原理、基础以及在Linux上的实现

导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模型及TCP/IP参考模型 OSI模型(open system interconnection reference model)是基于国际标准化组织(ISO)的建议而发展起来的,它分为如图3-1所示的七层.当卫星和无线网络出现以后,现有的协议在和这些网络互联时出现了问题,所以需要一种新的参考体系结构,能无缝地连接多个网络.这个体系结构就是TCP/IP参考模

ICMP和arp协议以及tcp/ip学习

ICMP:http://blog.csdn.net/tigerjibo/article/details/7356936 ARP:http://blog.csdn.net/tigerjibo/article/details/7351992 IP分片:http://www.vants.org/?post=106 TSO/GSO linux内核源码剖析 udp: http://modernrobber.blog.163.com/blog/static/214636320074305183395/ ht

零基础入门 实战mpvue2.0多端小程序框架

第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟快速入门微信小程序(已掌握,可略过)在这一章节中,老师讲带领你从如何注册微信小程序开发者账号.工具的下载开始,到完成第一个小程序,再到组件与 API 的使用整个过程,最后来总结微信原生小程序的缺点. 第3章 30 分钟快速入门 Vue.js 框架(已掌握,可略过)在这一章节中,老师将带领你从第一个

java学习的一些预备知识和一些简单的java小程序

1先了解一些基本的dos命令 dir     ·列出当前目录下的文件和文件夹 md      创建文件夹 rd        删除文件夹(文件下没有子文件) del "文件夹名"    可以删除带子文件的文件夹 cd..    使文件夹目录一层一层后退 cd\    回到根目录 haha>1.txt    创建文档,并将haha写入到1.txt文档中 del 1.txt    删除文件(不走回收站) del  *.txt    只删除txt文件 exit    退出命令行 set

TCP/IP学习笔记(一):基础知识

[前言] 一位美女老师教这门课,上课全是英文,偶尔也蹦两句中文解释术语,不过基本不说……TCP/IP给我的第一印象是知识点琐碎,可能是因为我的知识面和知识量都很欠缺,不成体系. 老师的课件是基于<TCPIP协议族(第4版)>的,所以我就按照书的标题来记录笔记好了. 另外我还买了一本科普类的书籍<图解TCP/IP(第5版)>,还有一本教材<TCP/IP网络互连--卷I(第5版)>作为参考,不知道要看到猴年马月才能有收获. ====================我是分割线

TCP/IP学习笔记(1)----------详解

TCP/IP协议 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成.TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准.协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求.通俗而言:TCP负责发现传输的问题,一有问题就发出信号,

TCP/IP学习笔记(2)----------IP协议与寻址

简介 下一博文终将会详细解析TCP/IP协议 本讲中主要注重于寻址 TCP/IP协议族中最核心的协议,提供不可靠.无连接的数据报传输服务. 不可靠:不能保证IP数据报能成功送达. 无连接:并不维护后续数据报的状态信息,每个数据报的处理都是相互独立.数据报可能不会按照发送顺序接收.同一站点向另一站点发送的多个数据报可能经过不同的路由到达. 帧格式 IP数据报格式如下. 版本:IP协议版本号,目前为4.故称为IPv4. 首部长度:以4字节为单位.最小值为5,不包含可选字段的IP首部大小为20字节.最

TCP/IP 协议的基础知识

一个 http 请求的整个流程 负责域名解析的 DNS 服务 首先,用户访问一个域名,会经过 DNS 解析 DNS(Domain Name System),它和 HTTP 协议一样是位于应用层的协议,主要提供域名到 IP 的解析服务.我们其实不用域名也可以访问目标主机的服务,但是 IP 本身不是那么容易记,所以使用域名进行替换使得用户更容易记住. 加速静态内容访问速度的 CDN 我这里只讲了比较简单的解析流程,在很多大型网站,会引入 CDN 来加速静态内容的访问, 这里简单给大家解释一下什么是