C++简单客户端和服务器端通信


INADDR_ANY 就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”


服务器有多个网卡,可能每个网卡上有不同的IP地址,所有通过INADDR_ANY发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的



AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的


对应于一个任务进行的每一次WSAStartup()调用,必须有一个WSACleanup()调用.只有最后的WSACleanup()做实际的清除工作;


良好的Windows Sockets应用程序会通过调用WSACleanup()指出它从Windows Sockets实现中注销.本函数因此可以用来释放分配给指定应用程序的资源.


int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );
⑴ wVersionRequested:一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,高阶字节指定小版本(修订本)号,低位字节指定主版本号。
⑵lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets[1] 实现的细节。
WindowsSockets API提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指明主版本号。


SOCK_STREAM提供面向连接的稳定数据传输,即TCP协议


inet_addr方法可以转化字符串,主要用来将一个十进制的数转化为二进制的数,用途多于ipv4的IP转化


服务器端:

#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")

void main()
{
    WSADATA wsd;
    SOCKET server;                                            //服务器socket
    SOCKADDR_IN addrSrv;
    char sendBuf[100];
    char recvBuf[100];
    SOCKADDR_IN addrClient;
    SOCKET client;                                            //连接的客户端socket
    int len;
    if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
    {
        printf("start up failed!\n");
        return;
    }
    server = socket(AF_INET, SOCK_STREAM, 0);                    //创建socket
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);            //设置地址
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);                            //设置端口号
    bind(server, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));        //绑定
    listen(server, 5);                                        //设置最多连接数
    len = sizeof(SOCKADDR);
    while (1)
    {
        client = accept(server, (SOCKADDR*)&addrClient, &len);    //接收客户端连接
        send(client, "123徐海涛hunk xu", strlen(sendBuf) + 1, 0);            //发送信息客户端
        recv(client, recvBuf, 100, 0);                            //接收客户端数据
        printf("%s\n", recvBuf);
        closesocket(client);
    }
    closesocket(client);                                    //关闭连接
    WSACleanup();
}

客户端:

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
    WSADATA wsd;
    SOCKET sockClient;                                            //客户端socket
    SOCKADDR_IN addrSrv;
    char recvBuf[100];
    if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
    {
        printf("start up failed!\n");
        return;
    }
    sockClient = socket(AF_INET, SOCK_STREAM, 0);                    //创建socket
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6000);
    connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));    //连接服务器端
    recv(sockClient, recvBuf, 100, 0);                                //接收服务器端数据
    send(sockClient, "hello world", strlen("hello world") + 1, 0);    //向服务器端发送数据
    closesocket(sockClient);                                    //关闭连接
    WSACleanup();
    printf(recvBuf);
    system("pause");
}


我使用的是VS2015控制台程序运行的


这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述


注意:要分别为客户端和服务器端建立两个控制台应用程序,然后分别 生成和运行


这里写图片描述



FR:海涛高软(hunk Xu) QQ技术交流群:386476712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值