头文件tcpServer.h
#include <sys/socket.h>
//int socket(int family, int type, int protocl)
//int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addlen)
//int listen(int sockfd, int backlog)
//int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
#include <netinet/in.h>
//INADDR_常值均为主机字节序,需通过htol转换为网络字节序
#include <unistd.h>
//ssize_t read(int filedes, void *buf, size_t nbytes);
#include <stdio.h>
//int printf(const char *format, ...)
#include <strings.h>
//void bzero(void *dest, size_t nbytes)
#include <stdlib.h>
//void exit(int status)
源文件tcpServer.cpp
#include "tcpServer.h"
void str_echo(int sockfd)
{
ssize_t n;
char buf[1024];
while ( (n = read(sockfd, buf, 1024)) > 0)
printf("%s",buf);
}
int main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(10086);
bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
listen(listenfd, 10);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
if ( (childpid = fork()) == 0) { /* child process */
close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
close(connfd); /* parent closes connected socket */
}
}
CMakeLists.txt文件
cmake_minimum_required(VERSION 3.10)
project(tcpServer)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
-g \
-Wall \
-std=c++11 \
-O2")
add_executable(tcpServer tcpServer.cpp tcpServer.h)
使用netcat(nc)进行测试