一个简单的TCP服务端

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_```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值