【tcp-ip学习总结】使用tcp协议实现简单的通信小程序

环境:vs2013

server.c

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

void main()
{
    WSADATA wsaData;//协议栈
    struct sockaddr_in server, client;//服务端和客户端的地址
    int iLen;
    char recMessage[1024]; //接受字符串缓冲区
    SOCKET sAccept;//连接上来的那个客户端套接口
    memset(recMessage, 0, sizeof(recMessage));//将接收缓冲区内容全部变为0

    printf("-------------------------\n");
    printf("服务器在等待\n");
    printf("-------------------------\n");
    /*
        检查协议栈是否加载成功
    */
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("协议栈加载失败!\n");
        return;
    }
    //创建服务器端套接口
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0);

    if (sListen == INVALID_SOCKET)
    {
        printf("sListen套接口创建失败!\n");
        return;
    }
    //为server端地址赋值
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = htonl(INADDR_ANY);

    //将服务端地址和服务端socket套接口绑定到一起
    if (bind(sListen, (LPSOCKADDR)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("绑定失败!\n");
        return;
    }
    //开始监听
    if (listen(sListen, 5) == SOCKET_ERROR)
    {
        printf("监听失败!\n");
        return;
    }
    //客户端地址长度
    iLen = sizeof(client);
    while (1)
    {
        //得到连接上来的那个客户端套接口
        sAccept = accept(sListen, (struct socketaddr*)&client, &iLen);
        if (sAccept == INVALID_SOCKET)
        {
            printf("接受失败!");
            break;
        }

        printf("接受的客户端的地址IP是:[%s], port[%d]\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
        //接收数据
        while (1)
        {
    //从这个客户端套接口上面接收信息
            int recLen = recv(sAccept, recMessage, sizeof(recMessage), 0);

            if (recLen == 0)
                return;
            else if (recLen == SOCKET_ERROR)
            {
                printf("接收失败!\n");
            }
            printf("沸沸腾:%s\n", recMessage);
        }

    }
    closesocket(sAccept);//关闭套接口
    closesocket(sListen);
    WSACleanup();//清空协议栈
}

client.c

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

void  main()
{
    WSADATA wsaData;//协议栈
    struct sockaddr_in server;//server端的地址情况
    SOCKET sClient;//客户端套接口

//加载协议栈
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("协议栈加载失败!\n");
        return;
    }
//初始化服务器端的地址,与端口情况
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = inet_addr("172.17.152.206");
    //创建一个tcp的套接口
    sClient = socket(AF_INET, SOCK_STREAM, 0);

    if (sClient == INVALID_SOCKET)
    {
        printf("套接口创建失败!\n");
        return;
    }
    //向服务器端申请连接
    if (connect(sClient, (struct sockaddr*)&server, sizeof(server)) == INVALID_SOCKET)
    {
        printf("连接失败!\n");
        return;
    }

    for (int i = 0; i < 5; i++)
    {
        printf("田腾飞: ");
        char message[1024];
        gets_s(message,1024);
        //向客户端套接口发送数据
        int iSend = send(sClient, message, sizeof(message), 0);
        if (iSend == SOCKET_ERROR)
        {
            printf("发送失败!\n");
            break;
        }
        else if (iSend == 0)
            break;
        else
        {
            printf("发送成功!\n");
        }


    }

    closesocket(sClient);//关闭套接口
    WSACleanup();//清楚协议栈
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值