C++ 实现 TCP 协议
使用 C++ 实现 TCP 协议需要使用 Windows 套接字 API。以下是一个简单的 C++ 示例代码,使用套接字 API 创建 TCP 客户端程序:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData
SOCKET ConnectSocket = INVALID_SOCKET
struct addrinfo *result = NULL, *ptr = NULL, hints
int iResult
// 初始化 Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData)
if (iResult != 0) {
std::cout <<"WSAStartup failed: " <<iResult <<std::endl
return 1
}
ZeroMemory(&hints, sizeof(hints))
hints.ai_family = AF_UNSPEC
hints.ai_socktype = SOCK_STREAM
hints.ai_protocol = IPPROTO_TCP
// 解析服务器地址和端口
iResult = getaddrinfo("www.example.com", "80", &hints, &result)
if (iResult != 0) {
std::cout <<"getaddrinfo failed: " <<iResult <<std::endl
WSACleanup()
return 1
}
// 创建套接字并连接服务器
for (ptr = resultptr != NULLptr = ptr->ai_next) {
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol)
if (ConnectSocket == INVALID_SOCKET) {
std::cout <<"socket failed: " <<WSAGetLastError() <<std::endl
WSACleanup()
return 1
}
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen)
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket)
ConnectSocket = INVALID_SOCKET
continue
}
break
}
freeaddrinfo(result)
if (ConnectSocket == INVALID_SOCKET) {
std::cout <<"Unable to connect to server" <<std::endl
WSACleanup()
return 1
}
// 发送和接收数据
iResult = send(ConnectSocket, "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n"), 0)
if (iResult == SOCKET_ERROR) {
std::cout <<"send failed: " <<WSAGetLastError() <<std::endl
closesocket(ConnectSocket)
WSACleanup()
return 1
}
char recvbuf[512]
do {
iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf), 0)
if (iResult >0) {
std::cout.write(recvbuf, iResult)
}
else if (iResult == 0) {
std::cout <<"Connection closed" <<std::endl
}
else {
std::cout <<"recv failed: " <<WSAGetLastError() <<std::endl
}
} while (iResult >0)
// 关闭套接字和清理 Winsock
closesocket(
最简单的那种?我给你写一个=,=//服务器
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main()
{
//创建套接字
int serverSocket= socket(AF_INET,SOCK_STREAM,0)
struct sockaddr_in server_addr
struct sockaddr_in clientAddr
int addr_len = sizeof(clientAddr)
int client
char buffer[200]
//创建地址
bzero(&server_addr,sizeof(server_addr))
server_addr.sin_family =AF_INET
server_addr.sin_port = htons(5555)
server_addr.sin_addr.s_addr = htonl(INADDR_ANY)
//绑定
bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr))
//帧听
listen(serverSocket,5)
printf("客户端发过来的 :\n")
//接收
client=accept(serverSocket,(sockaddr *)&clientAddr,(socklen_t*)&addr_len)
printf("客户端发过来的 :\n")
while(1)
{
if(recv(client,buffer,sizeof(buffer),0)>0)
printf("客户端发过来的 : %s\n",buffer)
}
return 0
}
//客户端
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main()
{
struct sockaddr_in serverAddr
int clientSocket=socket(AF_INET,SOCK_STREAM,0)
char sendbuf[200]
//创建地址信息
serverAddr.sin_family=AF_INET
serverAddr.sin_port=htons(5555)
serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1")
//连接服务器
connect(clientSocket,(sockaddr*)&serverAddr,sizeof(serverAddr))
printf("连接目标主机中.....\n连接完成......\n")
//
while(1)
{
printf("请输入发给服务器的数据 : ")
scanf("%s",sendbuf)
//strcmp函数作用,比较两个东东(按ASCII值大小相比较),相同就==0。
if(strcmp(sendbuf,"x")==0)
break
send(clientSocket,sendbuf,sizeof(sendbuf),0)
}
close(clientSocket)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)