使用C++基于windows平台下实现Tcp客户端请求
main.cpp
#include <winsock2.h>
#include <WS2tcpip.h>
#include <iostream>
using namespace std;
//指定动态库的lib文件
#pragma comment(lib,"ws2_32.lib")
int main() {
//初始化winsock2.2相关的动态库
WSADATA wd; //获取socket相关信息
if(0 != WSAStartup(MAKEWORD(2, 2), &wd)) { //0 表示成功
cout << "WSAStartup error: " << WSAGetLastError() << endl;
return 0;
}
//1. 创建TCP socket 流式套接字
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == s) {
cout << "socket error :" << WSAGetLastError() <<endl;
return 0;
}
//2. 连接服务器
sockaddr_in addr;//不建议使用sockaddr 建议使用sockaddr_in
addr.sin_family = AF_INET; //地址族
addr.sin_port = htons(8888); //网络字节序
//addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//网络字节序 inet_addr只能为ipv4转换 属于低版本 不建议用
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);//ip地址转网络字节序
int len = sizeof(sockaddr_in);
if(SOCKET_ERROR == connect(s, (sockaddr*)& addr, len)) {
cout << "connect error : " << WSAGetLastError() << endl;
return 0;
}
//3. 接受发送消息
int ret = 0;
do {
//接受客户端的消息
char buf[64] = {'\0'};
char *address = new char;
ret = recv(s, buf, 64, 0);//把flag置 0
//cout << "recv" << inet_ntoa(addr.sin_addr) << ": "<< buf << endl; //inet_ntoa 转换为IP字符串 inet_ntoa只能为ipv4转换 属于低版本 不建议用
cout << "recv : " << inet_ntop(AF_INET, (void*)&addr.sin_addr, address, sizeof(SOCKADDR_IN)) << ": " << buf << endl; //inet_ntoa 转换为IP字符串
//发送
char str[20] = "I am Client!";
ret = send(s, str, strlen(str), 0);
Sleep(1000); // 1s发送一次
} while(ret != SOCKET_ERROR && ret != 0);
//4. 关闭套接字
closesocket(s);
//清理winsock 环境
WSACleanup();
return 0;
}