在Windows系统中使用C++创建Tcp服务端
由于项目中偶尔会要求用c++实现小功能例如数据传输数据存储,因此在此记录一种简单的用法。
(此文章重点在于使用,不在于全面。)
代码如下:
#include <iostream>
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#pragma comment(lib,"WS2_32.lib")
//tcp通信服务端
void createTcpServer()
{
//初始化Socket
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
sockaddr_in serverAddr;
sockaddr_in clientAddr;
int client;
char buffer[200] = "";
SOCKET serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(9999);
//先绑定
if (bind(serverSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
printf("127.0.0.1 bind fail!\n");
return;
}
//设置服务器上的socket为监听状态
if (listen(serverSock, 5) < 0)
{
printf("127.0.0.1 listen fail!\n");
return;
}
while (true)
{
printf("Listening on port: %d\n", 9999);
//调用accept函数后,会进入阻塞状态
//accept返回一个套接字的文件描述符,这样服务器端便有两个套接字的文件描述符,
//serverSocket和client。
//serverSocket仍然继续在监听状态,client则负责接收和发送数据
//clientAddr是一个传出参数,accept返回时,传出客户端的地址和端口号
//addr_len是一个传入-传出参数,传入的是调用者提供的缓冲区的clientAddr的长度,以避免缓冲区溢出。
//accept阻塞执行,直到获取到有客户端连接
int clientAddrLen = sizeof(clientAddr);
client = accept(serverSock, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (client < 0)
{
perror("accept");
continue;
}
printf("\nrecv client data...n");
//inet_ntoa ip地址转换函数,将网络字节序IP转换为点分十进制IP
//表达式:char *inet_ntoa (struct in_addr);
printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));
printf("Port is %d\n", htons(clientAddr.sin_port));
while (1)
{
if (recv(client, buffer, 200, 0) < 0)
{
perror("recv");
continue;
}
printf("%drecv data is %s\n", 200, buffer);
send(client, buffer, 200, 0);
}
}
}
void main()
{
createTcpServer();
}
运行结果如下:
有疑问可联系邮箱:1280392860@qq.com