1. 新建TCP客户端项目
2. 编写TCP_Client
代码
#include <WinSock2.h> // winsock的头文件
#include <iostream>
using namespace std;
// 指定动态库lib文件
#pragma comment(lib,"ws2_32.lib")
// TCP客户端
int main()
{
// 初始化winsock2.2相关的动态库
WSADATA wd;
if(WSAStartup(MAKEWORD(2,2), &wd) != 0) // 0表示成功
{
cout << "WSAStartup Error:" << WSAGetLastError() << endl;
return 0;
}
// 1.创建TCP socket,流式套接字
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
cout << "socket Error:" << WSAGetLastError() << endl;
return 0;
}
// 2. 链接服务端
sockaddr_in addr; // 不建议使用sockaddr,建议用sockaddr_in
addr.sin_port = htons(8000); // 网络字节序
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 网络字节序
addr.sin_family = AF_INET; // 地址族
int len = sizeof(sockaddr_in);
if(connect(s, (sockaddr*)&addr, len) == SOCKET_ERROR)
{
cout << "connect error:" << WSAGetLastError() << endl;
return 0;
}
// 3.接收发送消息
int ret=0;
do{
// 接收服务端的消息
char buf[64] = {'\0'};
ret = recv(s, buf, 64, 0); // 把flag置0
// inet_ntoa转换为IP字符串
cout << "recv" << inet_ntoa(addr.sin_addr) << ": " << buf << endl;
// 发送
ret = send(s, "I am Client!", strlen("I am Client!"), 0);
Sleep(1000);
}while(ret != SOCKET_ERROR && ret!= 0);
// 4.关闭套接字
closesocket(s);
// 清理winsock环境
WSACleanup();
return 0;
}
3. 先启动服务端
服务端正在等待客户端连接
4. 再启动客户端
连接成功,互相通信