#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();
}
c++Socket客户端 (vs2013)
最新推荐文章于 2023-07-20 19:11:40 发布