⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prlnet.c

📁 104规约linux
💻 C
字号:
//******************************************************************
//
//   结构定义文件:PrlNet.c
//       文件内容:网络相关实现函数
//   结构定义规则:见文档《变量定义规范》
//         创建者:
//       创建时间:2007-8-1
//******************************************************************

//*************************头文件包含区*****************************
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <assert.h> 
#include "ShareMemOp.h"
#include "ShareMemDebugOut.h"
#include "DefPrl.h"
//******************************************************************

int NetCreateServer()
{   
	  int Server=socket(AF_INET, SOCK_DGRAM, 0);
	  unsigned int Port;
	  struct sockaddr_in ServAddr;
	  int RetBind;
	  GetGlobalParam(GPT_LOCAL_PORT, &Port);
	  
    if(Server<0) 
    {
        return -1;
    }
    
    ServAddr.sin_family = AF_INET;
    ServAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    ServAddr.sin_port = htons(Port);
    DebugOutMsg(IX_M_NQS, 0, "Port=%ld", Port);
    RetBind = bind (Server, (struct sockaddr *) &ServAddr,sizeof(ServAddr));
    if(RetBind < 0) 
    {
        return -1;
    }
    return Server;
}

int NetReceiveMessage(int Server, TNetMessage *Message)
{
    int ReceivedBytes = recvfrom(Server, Message->Content, MAX_MESSAGE_LEN, MSG_DONTWAIT, (struct sockaddr *) &Message->FromAddr, &Message->FromAddrLen);
    Message->Length = ReceivedBytes;

    return ReceivedBytes;
}

int NetSendMessage(TNetMessage *Message)
{
    int TransUnitCount = 0;
    int Loop = 0;
    char Buffer[TRANS_UNIT_SIZE];
    //与上位机通讯,大包分割为小包,包前加总包数和包序号,每包固定长度MAX_SMALL_MSG
    TransUnitCount = Message->Length / (TRANS_UNIT_SIZE-(sizeof(int)*2));
    if(Message->Length % (TRANS_UNIT_SIZE-(sizeof(int)*2)) > 0)
    {
        TransUnitCount ++;
    }
    
    for(Loop=1; Loop <= TransUnitCount; Loop ++)
    {
        int SendBytes = 0;
        memcpy(Buffer, &TransUnitCount, sizeof(int));
        memcpy(Buffer+sizeof(int), &Loop, sizeof(int));
        memcpy(Buffer+(sizeof(int)*2)
           , &Message->Content[(Loop-1)*(TRANS_UNIT_SIZE-(sizeof(int)*2))]
           , TRANS_UNIT_SIZE-(sizeof(int)*2));
        //分包发送,每包固定为MAX_SMALL_MSG字节
        SendBytes=sendto(Message->Server 
           , Buffer, TRANS_UNIT_SIZE, 0
           , (struct sockaddr *) &Message->FromAddr
           , Message->FromAddrLen); 
        if(SendBytes<0) 
        {
            return -1;
        }
    }
    return Message->Length;
}


⌨️ 快捷键说明

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