作者:小超201209 | 来源:互联网 | 2023-09-15 10:59
客户端:
新版本中,加入了#include #pragma comment(lib, "Ws2_32.lib")进行预编译
#include
#include
#include
#include
#pragma comment(lib, "Ws2_32.lib")class tcpClient{public:tcpClient() {}void buildClient(){std::cout <<"### TCP/IP Client Demo ###" <" < " <#include int socket(int domain, int type, int protocol);1.domain表示协议簇&#xff0c;常用协议簇有:AF_UNIX&#xff08;本机通信&#xff09;AF_INET&#xff08;TCP/IP – IPv4&#xff09;AF_INET6&#xff08;TCP/IP – IPv6&#xff09;2.type表示套接字类型,常用套接字有:SOCK_STREAM&#xff08;TCP流&#xff09;SOCK_DGRAM&#xff08;UDP数据报&#xff09;SOCK_RAW&#xff08;原始套接字&#xff09;3.最后一个 “protocol”一般设置为“0”&#xff0c;也就是当确定套接字使用的协议簇和类型时&#xff0c;这个参数的值就为0&#xff0c;但是有时候创建原始套接字时&#xff0c;并不知道要使用的协议簇和类型&#xff0c;也就是domain参数未知情况下&#xff0c;这时protocol这个参数就起作用了&#xff0c;它可以确定协议的种类。4.socket是一个函数&#xff0c;那么它也有返回值&#xff0c;当套接字创建成功时&#xff0c;返回套接字&#xff0c;失败返回“-1”&#xff0c;错误代码则写入“errno”中。*/SOCKET sockClient &#61; socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET &#61;&#61; sockClient) {std::cout <<"[E] Create socket failed! Error code is: " <中定义&#xff0c;sockaddr的缺陷是&#xff1a;sa_data把目标地址和端口信息混在一起了&#xff0c;如下&#xff1a;struct sockaddr {sa_family_t sin_family;//地址族char sa_data[14]; //14字节&#xff0c;包含套接字中的目标地址和端口信息};2.sockaddr_in:sockaddr_in在头文件#include或#include 中定义&#xff0c;该结构体解决了sockaddr的缺陷&#xff0c;把port和addr 分开储存在两个变量中sin_family:地址族sin_port:端口sin_addr:32位IP地址sin_zero:不需要*/SOCKADDR_IN addrServer;inet_pton(AF_INET, "127.0.0.1", &addrServer.sin_addr.s_addr);//addrServer.sin_addr.s_addr &#61; inet_addr("127.0.0.1") /*inet_addr(m_server_addr)*/;addrServer.sin_family &#61; AF_INET;addrServer.sin_port &#61; htons(8000)/*htons(m_server_port)*/;//std::cout <<"[I] Current addr is: " <> strBuf;send(sockClient, strBuf.data(), strBuf.length(), 0);char recvBuf[100] &#61; { 0 };recv(sockClient, recvBuf, 100, 0);std::cout <<"[I] Receive data from server: " <
服务端:
#include
#include
#include#pragma comment(lib, "Ws2_32.lib")class tcpServer{public:tcpServer() {}void buildServer(){std::cout <<"### TCP/IP Server Demo ###" <" <