【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();//清空协议栈
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值