c++Socket客户端 (vs2013)

#include <WinSock2.h>  
#include <stdio.h>  
#include <string>
#include <thread>
#include <Windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")  

//获取主机ip
string GetLocalIpAddress()
{
//装载winscock库
    WORD wVersionRequested = MAKEWORD(2, 2);
    WSADATA wsaData;
    if (WSAStartup(wVersionRequested, &wsaData) != 0)
        return "";

//获取主机名称
    char local[255] = { 0 };
    gethostname(local, sizeof(local));//该函数可以获取本地主机的主机名
    hostent* ph = gethostbyname(local);//从主机名数据库中得到对应的“主机”。
    if (ph == NULL)
        return "gethostname()  Failed!";
//获取ip
    in_addr addr;
    //h_addr_list其实是一个指针数组,数组中每个元素都是in_addr型指针
    memcpy(&addr, ph->h_addr_list[0], sizeof(in_addr)); // 这里仅获取第一个ip  

    //addr得到的地址是网络字节顺序。要用inet_ntoa()转成正常的字符:
    string localIP;
    localIP.assign(inet_ntoa(addr));//函数assign()常用在给string类变量赋值

    WSACleanup(); //释放为该程序分配的资源,终止对winsock动态库的使用  
    return localIP;
}


void r(SOCKET &sockClient,int n){
    while (n>0){
        char buff[1024];
        memset(buff, 0, sizeof(buff));//当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值
       n= recv(sockClient, buff, sizeof(buff), 0);  
        printf("%s\n", buff);
        Sleep(1000);
    }
}


void main()
{
    //加载套接字  
    WSADATA wsaData;


    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //WSAStartup加载套接字库,返回int ,MAKEWORD(2, 2),返回WORD,希望使用的版本 
    {
        printf("Failed to load Winsock");
        return;
    }

    构建服务器地址信息  
    SOCKADDR_IN addrSrv;
    addrSrv.sin_family = AF_INET; //地址家族  
    addrSrv.sin_port = htons(5099);//注意转化为网络节序 ,加载端口号 5099对应c++_Server,3335为Linux
    addrSrv.sin_addr.S_un.S_addr = inet_addr(GetLocalIpAddress().c_str()); //加载ip地址

    //创建套接字  
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);//参三可以指定协议
    if (SOCKET_ERROR == sockClient){
        printf("Socket() error:%d", WSAGetLastError());
        return;
    }

    //向服务器发出连接请求  
    if (connect(sockClient, (struct  sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){
        printf("Connect failed:%d", WSAGetLastError());
        return;
    }
    else
    {
        thread t1(r, sockClient, 1);
        t1.detach();
        //Sleep(200);
    }

    //发送数据
    char buf[] = "hello, this is a Client....";
    while (true){
        send(sockClient, buf, sizeof(buf), 0);
        string s;
        cin >> s;
        s.insert(0, "Client:");
        strcpy(buf, s.c_str());
    }
    system("pause");
    //关闭套接字  
    closesocket(sockClient);
    WSACleanup();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值