• TCP网络通信服务器端简单示例


    服务器端:

    #include <stdio.h>
    #include <winsock2.h> //和网络通信相关的函数的声明,类型的声明,常量的定义等都在此头文件中

    #pragma comment(lib,"ws2_32.lib")

    int main()
    {
    //第一步:初始化Socket函数库
    WSADATA wsaData;
    //向系统请求使用2.2版本的Socket函数库,wsaData用于接收winsocket详细信息
    WSAStartup(MAKEWORD(2,2),&wsaData); 


    //第二步:创建流式套接字,相当于买部手机
    //AF_INET:使用英特网地址家族,即TCP/IP协议族
    //三种常用的套接字类型:
    //流(式)套接字:SOCK_STREAM ,用于实现基于TCP协议的通信,数据的传输采用字节流的方式传输
    //数据报套接字:SOCK_DATAGRAM, 用于实现基于UDP协议的通信,数据采用数据报的方式传输
    //原始套接字:SOCK_RAW, 用于实现基于IP协议的通信,较底层的通信,用的较少,一般用于实现抓包等网络嗅探功能
    //0:默认协议编号,
    SOCKET sockListen=socket(AF_INET,SOCK_STREAM,0);

    if(INVALID_SOCKET == sockListen)
    {
    printf("创建监听套接字失败! ");
    return 1;
    }

    //第三步:绑定地址,相当于给手机上号
    //通过socketaddr_in结构体指定要绑定的地址,相当于选号
    sockaddr_in myaddr;
    myaddr.sin_family=AF_INET;
    myaddr.sin_addr.S_un.S_addr=INADDR_ANY; //指定IP地址为本机当前的任意IP地址
    //myaddr.sin_addr.s_addr=INADDR_ANY; //指定IP地址为本机当前的任意IP地址
    //myaddr.sin_addr.s_addr=inet_addr("128.0.37.13"); //指定IP地址为当前本机的某个IP地址
    myaddr.sin_port = htons(8888); //指定端口号为8888

    //绑定地址,相当于将SIM卡插入手机中
    if(SOCKET_ERROR==bind(sockListen,(sockaddr*)&myaddr,sizeof(myaddr)))
    {
    printf("绑定地址失败! "); //端口号可能被其他进程所占用
    return 1;
    }


    //第四步:监听,即将套接字设置为监听状态,相当于将手机待机
    //5:监听等待队列的长度为5
    listen(sockListen,5);

    while(1)
    {
    //第五步:接收客户端连接请求,相当于接听别人的来电
    //accept函数返回的套接字称为连接套接字,用于实现在一条连接上的通信
    sockaddr_in addrClient;
    int iAddrLen=sizeof(addrClient);
    SOCKET sockConn=accept(sockListen,(sockaddr*)&addrClient,&iAddrLen);

    printf("客户%s:%d已经连接! ",inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port));

    //第六步:收发数据,相当于互相说话
    //发送数据
    char szMsg[1024]="hello";
    scanf("%s",szMsg);
    send(sockConn,szMsg,strlen(szMsg),0);

    //接收数据
    memset(szMsg,0,sizeof(szMsg));
    if(SOCKET_ERROR ==recv(sockConn,szMsg,sizeof(szMsg)-1,0))
    {
    printf("failed! ");
    }
    printf("客户端说:%s ",szMsg);

    //第七步:关闭连接套接字,断开连接,相当于通话完毕挂机
    closesocket(sockConn);
    }

    //如果不需要再接收客户端连接请求,可以关闭监听套接字,相当于将手机关机或设置为飞行模式
    closesocket(sockListen);

    //第八步:释放Socket函数库
    WSACleanup();

    return 0;
    }

    Do one thing at a time,and do well.
  • 相关阅读:
    mongodb 初学 意外 连接服务器异常(Connection refused)
    mongodb 关闭服务器
    Redis 入门指令
    mongodb 在 Ubuntu系统上的安装及卸载
    Java 使用 Redis
    随笔 -- IO -- Socket/ServerSocket -- 系统概述
    java enum(枚举)使用详解 + 总结
    Java -- IO -- 目录
    Java 流(Stream)、文件(File)和IO -- Java ByteArrayInputStream类
    INSERT INTO .. ON DUPLICATE KEY UPDATE ...
  • 原文地址:https://www.cnblogs.com/huiz/p/9610689.html
Copyright © 2020-2023  润新知