1.目录结构
->include //存放.h
->source //存放.cpp
->out //存放可执行文件
makefile //一键快速编译
2.所包含的文件
2.1 main.cpp
#include <stdio.h>
#include "main.h"
#include "Server.h"
#include <iostream> //std
#include <unistd.h> //sleep
#include <string.h>
static bool _mainTaskRun = true;
void Exit_Main_Task(void )
{
_mainTaskRun = false;
}
int main(int argc, char *argv[])
{
int iResut = 0;
std::cout << "Welcome!"<<std::endl;
std::cout << "server ip:"<<IP_ADDR << std::endl;
iResut = InitTcpServerTask();
if(0 != iResut)
{
std::cout<<"InitTcpServerTask failed!"<<std::endl;
return -1;
}
while (_mainTaskRun)
{
}
return 0;
}
2.2 Server.cpp
#include "Server.h"
#include "main.h"
#include <errno.h> //perror 打印一些错误信息
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h> //提供close方法
#include <arpa/inet.h> // 提供 inet_addr()
#include <sys/syscall.h> /*必须引用这个文件 */
#include "tcp_common.h"
/*静态函数声明区*/
static int TcpServerTask();
static void* Tcp_Server_Task_Main(void *);
int InitTcpServerTask()
{
std::cout<<"Enter InitTcpServerTask"<<std::endl;
if (0 !=TcpServerTask())
{
std::cout<<"TcpServerTask failed! "<<std::endl;
return -1;
}
return 0;
}
static int TcpServerTask()
{
std::cout<<"Enter TcpServerTask"<<std::cout;
pthread_t TcpServerThread_ ;
int ret = pthread_create(&TcpServerThread_,NULL,Tcp_Server_Task_Main,NULL);
if(ret)
{
std::cout<<"creat thread failed! error num is "<<ret<<std::endl;
return -1;
}
return 0;
}
static void* Tcp_Server_Task_Main(void *)
{
std::cout << "Tcp_Server_Started "<< std::endl;
int ret = 0;
// WSADATA wsd;
// if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
// {
// WSACleanup();
// return -1;
// }; //初始化套接字
int serverSocketFd = 0;
serverSocketFd = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocketFd == INVALID_SOCKET)
{
std::cout << "creat socket failed!" << std::endl;
// WSACleanup();
return (void *)-1;
}
sockaddr_in local_addr;
sockaddr_in remote_addr;
memset(&local_addr, 0x0, sizeof(sockaddr_in));
memset(&remote_addr, 0x0, sizeof(sockaddr_in));
local_addr.sin_addr.s_addr = inet_addr(IP_ADDR);
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(TCP_SERVER_PORT);
int addrlen_ = sizeof(struct sockaddr_in);
//绑定套接字描述符和指定的ip 端口
int temp = 0;
temp = bind(serverSocketFd, (sockaddr*)&local_addr, addrlen_);
perror("bind");
if ( temp == -1)
{
std::cout << "bind socket and addr failed !" << std::endl;
close(serverSocketFd);
return (void *)-1;
}
if (-1 == listen(serverSocketFd, MAX_CLIENT_NUM))
{
std::cout << "listen socket failed !" << std::endl;
close(serverSocketFd);
// WSACleanup();
return (void *)-1;
}
int client;
int i = 0;
while (1)
{
i++;
std::cout << "等待客户端第"<<i<<"次连接" << std::endl;
client = accept(serverSocketFd, (sockaddr*) &remote_addr,(socklen_t*) &addrlen_);
if(INVALID_SOCKET == client)
{
std::cout << "accept socket failed !" << std::endl;
close(serverSocketFd);
}
else
{
std::cout << "连接成功!" << std::endl;
char *msg = (char *)"hello";
send(client, msg, 6, 0);
char buff[MAX_TCP_BUF_LEN] = { 0 };
/*这个recv是阻塞的,如果不利用select函数,这里客户端连接上了但是又不发消息的化。服务端会一直阻塞在这里*/
int buff_len = recv(client, buff, MAX_TCP_BUF_LEN, 0);
if (buff_len > 0)
{
student t_student ;
memcpy(&t_student , buff,sizeof(student));
std::cout << "来自客户端的student信息:" << std::endl;
t_student.printStudent();
}
std::cout<<"test!"<<std::endl;
break;
}
}
close(serverSocketFd);
Exit_Main_Task();
// WSACleanup();
}
2.3 main.h
// #include "winsock2.h" //引用头文件
// #pragma comment (lib,"ws2_32.lib") //链接库文件
// #include<Windows.h>
#ifndef _MAIN_H_
#define _MAIN_H_
#include "Server.h"
#include <iostream>
#define MAX_TCP_BUF_LEN 1024
#define TCP_SERVER_PORT 11000
#define IP_ADDR "10.234.19.202"
#define MAX_CLIENT_NUM 3
void Exit_Main_Task(void);
#endif
2.4 Server.h
#ifndef _Server_H_
#include <iostream>
#define _Server_H_
#define INVALID_SOCKET -1
int InitTcpServerTask();
#endif // !_Server_H_```