TCP连接分为服务端和客户端。
服务端:
1.包含都文件 以及需要连接的动态库:
#include<WS2tcpip.h>
#include <process.h>
#pragma comment (lib,"ws2_32.lib")
2.创建Windows下存储socket版本信息的结构体并调用WSAStartup()函数确定版本信息:
WSADATA wd;
int n = WSAStartup(0X0202, &wd);
if (n)
{
std::cout << "版本使用错误:" << WSAGetLastError() << std::endl;
return -1;
}
WSAStartup()函数调用成功返回 0,不成功返回非0。可以用WSAGetLastError()函数查看错误代码。
3.调用int sock = socket(AF_INET, SOCK_STREAM, 0);,创建socket 句柄。
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);//AF_INET是表示Internet,
//SOCK_STREAM 为TCP协议标志
if (INVALID_SOCKET == sock)
{
std::cout << "句柄创建化失败:" << WSAGetLastError() << std::endl;
return -1;
}
4.调用bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
绑定端口及ip,服务器端可以般绑定全网段(ip=0)。
sockaddr_in server_addr = { AF_INET,htons(8585) };
server_addr.sin_addr.S_un.S_addr = 0;
n = bind(sock, (sockaddr*)&server_addr, sizeof(server_addr));
if (n)
{
std::cout << "端口绑定失败:" << WSAGetLastError() << std::endl;
return -1;
}
5.监听连接请求:使用 listen()
函数监听客户端连接请求。
int n = listen(sock, 5);
if (n)
{
std::cout << "监听失败:" << WSAGetLastError() << std::endl;
return -1;
}
6.接受客户端连接请求:使用 accept()
函数接受客户端的连接,并返回一个新的句柄,用于与客户端进行通信。
SOCKET psock;
psock = accept(sock, (sockaddr*)&client_addr, &client_addr_len);
7.使用 send()
和 recv()
函数发送和接收数据。
char buffer[256];
// 发送数据
send(psock, buffer, strlen(buffer), 0);
// 接收数据
recv(psock, buffer, sizeof(buffer), 0);
8.关闭套接字:使用 close()
函数关闭套接字。
客户端:
客户端前三步同服务的相同,客户端不需要绑定端口及IP。
4.使用connect(sock,(sockaddr*)&server_addr,sizeof(server_addr) )函数连接服务器。
sockaddr_in server_addr= { AF_INET };
server_addr.sin_port = htons(8585);
inet_pton(AF_INET, "192.168.100.100" ,& server_addr.sin_addr);
int n = connect(sock,(sockaddr*)&server_addr,sizeof(server_addr) );
if (n)
{
std::cout << "连接服务器失败:" << WSAGetLastError() << std::endl;
}
5.同服务端相同,使用 send()
和 recv()
函数发送和接收数据。
6.关闭套接字:使用 close()
函数关闭套接字。