首页HTML开始的地方

socket客户端

//MFC例子,客户端
//需要包含Winsock2.h头文件,并连接Ws2_32.lib库文件。
//【项目】-【属性】-【链接器】-【输入】-【附加依赖项】,进行编辑,添加 ws2_32.lib库。去掉从父级或项目默认设置继承的勾选

#include <iostream>
#include "Winsock2.h"

int main()
{




    //①**************************************************************//
    // ①、首先加载套接字库
    //加载套接字库,进行套接字库版本协商。第一个参数,指定请求的版本号。
    //wVersionRequested高位字节,指定所需的Winsock库副板本,低位字节是主版本。
    //可用MAKEWORD(x,y)宏,获得wVersionRequested的正确值,x是高位,y是低位。
    //第二个参数是,指向WSADATA结构的指针,加载库的版本有关信息填在此处。


    //WSADATA结构的,第一个字段wVersion:大算使用的winsock库版本。高位winsock的副板本,低位主版本。
    //第二个字段wHighVersion:现有winsock库的最高版本。高位winsock的副板本,低位主版本。
    //szDescription:事实上并没有用。
    //szSystemStatus:事实上并没有用。
    //iMaxSockets:不要使用。同时打开多少套接字。然而,应用WSAEnumProtocols来查询,很大程度与内存有关。
    //iMaxUdpDg:不要使用。数据报的最大长度。
    //lpVendorInfo:任何win32平台都没使用这个字段。


    //WSAStartup()成功调用后,最后要WSACleanUp()。msdn有调用的例子。

    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    //调用1.1版本的
    wVersionRequested = MAKEWORD(1, 1);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        return 0;
    }


    //看返回值低字节是否等于1,高字节是否等于1。
    if (LOBYTE(wsaData.wVersion) != 1 ||
        HIBYTE(wsaData.wVersion) != 1) {
        //如果不是请求的1.1版本,就清理返回。
        WSACleanup();
        return 0;
    }
    





    //②**************************************************************//
    //②、接下来,创建套接字。
    //SOCKET第一个参数,af:指定的地址簇,对于TCP/IP协议是AF_INET(也可写成PF_INET)
    //第二个参数type:指定套接字类型。对于1.1版本,只有两个SOCK_STREAM流式套接字TCP,SOCK_DGREAM数据报UDP。
    //第三个参数,与特定地址簇相关,设置0自动选择。
    //如果调用成功,返回新的SOCKET数据类型的套接字描述符,如果失败返回INVALID_SOCKET,错误信息可通过WSAGetLastError函数
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);



    

    //③**************************************************************//
    //③、客户端,不需要绑定,直接去连接。
    //connect()第一个参数:套接字
    //第二个参数:地址结构体指针,设置所要连接的服务器端的信息。
    //第三个参数:地址结构体的长度。

    SOCKADDR_IN addrSrv;//定义一个地址结构体
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置服务器端的IP地址,本机测试故127。
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port =htons(6000) ;//服务器端的端口,需要网络字节序。
    
    //然后可以调用connect进行连接了。
    connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));





    //④**************************************************************//
    //④、接收服务器端发送的数据
    char recvBuf[100];
    recv(sockClient,recvBuf,100,0);//直接设100,没有+1。
    printf("%s\r\n",recvBuf);





    //⑤**************************************************************//
    //⑤、向服务器发送数据
    send(sockClient,"This is client",sizeof("This is client")+1,0);//多发一个字节,\0作用。





    //⑥**************************************************************//
    //⑥、关闭套接字,并终止套接字库的使用。
    closesocket(sockClient);
    WSACleanup();





    system("PAUSE");
    return 0;
}

 

posted @ 2023-01-03 22:27  csnotes  阅读(36)  评论(0编辑  收藏  举报

这是页脚html