windows网络编程学习笔记

server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <winsock.h>
#include <windows.h>
#include <stdbool.h>
#define MAXLINE 80
#define SERV_PORT 6666

int main()
{
    //1.初始化网络环境
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
    {
        printf("初始化winsock失败\n");
        return -1;
    }

    printf("初始化winsock成功\n");

    //2. 网络通信代码
    //2.1 创建服务端套接字
    SOCKET socketSever = socket(AF_INET,SOCK_STREAM,0);
    if(INVALID_SOCKET == socketSever)
    {
        printf("创建socket失败\n");
        WSACleanup();
        return -1;
    }
    //2.2绑定ip地址和端口号
    struct sockaddr_in sever_addr;
    sever_addr.sin_family = AF_INET;
    sever_addr.sin_port = htons(6666);
    sever_addr.sin_addr.S_un.S_addr =inet_addr("192.168.1.112");
    if(bind(socketSever,(struct sockaddr*)&sever_addr,sizeof(sever_addr)) == -1)
    {
        printf("绑定失败\n");
        closesocket(socketSever);
        WSACleanup();
        return -1;
    }
    else
    {
        printf("绑定成功\n");
    }
    //2.3 监听连接
    if(listen(socketSever,5) == SOCKET_ERROR)
    {
        printf("监听端口号失败\n");
        closesocket(socketSever);
        WSACleanup();
        return -1;
    }
    else
    {
        printf("监听端口号成功\n");
    }
    //2.4 接收连接
    while(true)
    {
        printf("准备等待客户端的到来...\n");
        //创建一个用于通信的套接字
        //accept() 会阻塞程序执行,直到有新的请求到来。
        struct sockaddr_in clentAddr;
        int clentAddrLen = sizeof(clentAddr);
        SOCKET socketClent = accept(socketSever,(struct sockaddr*)&clentAddr,&clentAddrLen);
        if(INVALID_SOCKET == socketClent)
        {
            printf("接收客户端连接失败\n");
            continue;
        }
        else
        {
            printf("接收客户端连接成功\n");
        }
        //与客户端通信的循环
        //数据传输:
        //读取数据:通常使用recv()或read()函数从连接的套接字中读取数据。
        //发送数据:使用send()或write()函数向对方发送数据。这些函数将数据写入套接字,进而传输到对方。
        while(true)
        {
            char data[1024] = {};
            //int recv(SOCKET s, char FAR *buf, int len, int flags)
            //          套接字       缓冲区     缓冲区大小
            //返回值: >0 成功 =0 对方关闭了连接 <0 发生错误
            int ret = recv(socketClent,data,sizeof(data) - 1, 0);

            if(ret > 0)
            {
                printf("接收数据成功\n");

                //发送回复数据
                ret = send(socketClent,data,ret,0);
                if(ret == SOCKET_ERROR)
                {
                    printf("发送数据失败\n");
                    break; //发送失败断开连接
                }
            }
            else if (ret ==0) //客户端关闭连接
            {
                printf("客户端主动断开连接\n");
                break;
            }
            else //发生错误
            {
                printf("接收客户端数据失败\n");
                break;
            }
            
        }
        //关闭客户端套接字
        closesocket(socketClent);
        printf("当前客户端已断开连接,等待下一个客户端...\n");
    }



    //3.清理资源
    WSACleanup();
    printf("资源已清理\n");


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值