socket.cpp

来自「模仿wiondws写的linux/freeBSD系统的IOCP」· C++ 代码 · 共 72 行

CPP
72
字号
#include "socket.h"
Cmd *ksocket::unpack()
	{
		Scope_lock scope_lock(lock);
		Cmd *cmd;
		char *buffer;
		const unsigned int s = sizeof(*cmd);
		if(recv_buf.getrsize() < s)
			return NULL;

		char buf[s];
		recv_buf.fetch(buf,s);
		cmd = (Cmd*)buf;

		if(cmd->size > 108)
		{
			printf("error packet,size = %d\n",cmd->size);
			recv_buf.fetch(buf,s);
			cmd = (Cmd*)buf;
			return NULL;
		}

		if(recv_buf.getrsize() < cmd->size)
			return NULL;

		buffer = (char*)::operator new(cmd->size);

		recv_buf.get(buffer,cmd->size);

		return (Cmd*)buffer;
		
	}

	int ksocket::recv(unsigned int size)
	{
		Scope_lock scope_lock(lock);
		if(size == 0 || canRecv == false)
			return 0;
		size = size > recv_buf.getwsize() ? recv_buf.getwsize() : size;
		
		io_context[0].buf = recvbuf;
		io_context[0].rsize = size;
		io_context[0].userdata = this;
		io_context[0].handler = sockdl;
		io_context[0].type = IOREAD;

		Recv(sockdl,&io_context[0]);

		canRecv = false;


	}

	int ksocket::send(char *buf,unsigned int size)
	{
		Scope_lock scope_lock(lock);
		if(!buf || size == 0 || canSend == false)
			return 0;
		memcpy(sendbuf,buf,size);

		io_context[1].buf = sendbuf;
		io_context[1].rsize = size;
		io_context[1].userdata = this;
		io_context[1].handler = sockdl;
		io_context[1].type = IOWRITE;

		Send(sockdl,&io_context[1]);

		canSend = false;

	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?