当前位置: 首页 > 知识库问答 >
问题:

linux操作系统udp中的sendto api?

施学
2023-03-14
int acceptSocket;
char buf[100];
long sentbytes;
socklen_t len;
int port = 18227;

int CreateSocket()
{
    long rc;
    struct sockaddr_in addr, client;

       // Socket creation for UDP
       acceptSocket=socket(AF_INET,SOCK_DGRAM,0);

       if(acceptSocket==-1)
       {
         printf("Failure: socket creation is failed, failure code\n");
         return 1;
       }
       else
       {
         printf("Socket started!\n");
       }

     memset(&addr, 0, sizeof(struct sockaddr_in));
     addr.sin_family=AF_INET;
     addr.sin_port=htons(port);
     addr.sin_addr.s_addr=htonl(INADDR_ANY);
     rc=bind(acceptSocket,(struct sockaddr*)&addr,sizeof(addr));

     if(rc== -1)
     {
       printf("Failure: listen, failure code:\n");
       return 1;
     }
     else
     {
       printf("Socket an port %d \n",port);
     }

     while(rc!=-1)
         {
         len =sizeof(client);
         rc=recvfrom(acceptSocket,buf, sizeof(buf), 0, (struct sockaddr*) &client, &len);
         if(rc==0)
         {
           printf("Server has no connection..\n");
           break;
         }
         if(rc==-1)
         {
             printf("something went wrong with data %s", strerror(errno));
           break;
         }

         XcpIp_RxCallback( (uint16) rc, (uint8*) buf, (uint16) port );

            makeTimer("First Timer", &firstTimerID, 2, 2);   //2ms
                makeTimer("Second Timer", &secondTimerID, 10, 10);    //10ms
                makeTimer("Third Timer", &thirdTimerID, 100, 100);  //100ms
          }

       close(acceptSocket);
       return 0;
     }

int main()
{
     Xcp_Initialize();
     CreateSocket();
     return 0;
}

//API for sending the data to the client.
void XcpApp_IpTransmit( uint16 XcpPort,  Xcp_StatePtr8 pBytes, uint16 numBytes )
{
    struct sockaddr_in client;

        if ((long)XcpPort==port){
                sentbytes = sendto(acceptSocket,(char*)pBytes,(long)numBytes,0, (struct sockaddr*)&client, sizeof(client));
        }
        XcpIp_TxCallback(port,(uint16)sentbytes);
}

我创建了一个服务器端程序,用于从客户端接收数据并将响应发送回客户端。我能够通过recvfrom api从客户端接收数据,但后来我必须通过XcpApp_IpTransmit(uint16 XcpPort、Xcp_StatePtr8 pBytes、uint16 numBytes)中的sendto api将响应发送回客户端;(这是我的项目中支持的用于传输数据的api)。客户端是将数据发送到指定端口和ip地址的工具。我可以再次使用struct sockaddr_in客户端吗;在Transmit api中??有人能帮我吗??

共有2个答案

益智明
2023-03-14

这应该有效。当您使用 SOCK_DGRAM 时,您始终可以使用收到的地址(通常及其大小)发回数据。当然,例外情况包括对等套接字不可用的情况。

或者,如果您只有一个客户端,您可以使用< code>connect来设置默认远程对等地址,并且< code>send将使用它:

sockaddr_in addr;
socklen_t len;

len = sizeof(addr);
x = recvfrom(socket,buf, sizeof(buf), 0, (struct sockaddr*) &addr, &len);
connect(socket, (struct sockaddr*)addr, len);
...
send(socket, buf, bufsize, 0);
send(socket, buf, bufsize, 0);
send(socket, buf, bufsize, 0);

不过有一条评论。您正在使用AF_INET,您的代码将正常工作。但您也可以使其与其他协议兼容。为此:

sockadd_storage addr;
socklen_t len;

len = sizeof(addr);
x = recvfrom(socket,buf, sizeof(buf), 0, (struct sockaddr*) &addr, &len);
...
sendto(socket,buf,bufsize,0,(struct sockaddr*)addr, len);

这种类型的代码可以与任何数据报协议一起使用,包括AF_LOCAL和AF_INET6。

上官砚文
2023-03-14

<code>结构sockaddr_in客户端是否用于初始化错误的传输API?

所以你必须使用初始化的套接字结构。从上面的代码中,您可以成功地从客户端接收数据,但无法发送,因为您在传输函数中的< code>client结构是< code > NULL nothing initialized,那么该去哪里呢?

你可以做这样的事情

rc=recvfrom(acceptSocket,buf, sizeof(buf), 0, (struct sockaddr*) &client, &len);

sendto(acceptSocket,buf,rc,0,(struct sockaddr *)&client,sizeof(client));

或者将客户端结构传递给您的传输函数,如下所示

void XcpApp_IpTransmit( uint16 XcpPort,  Xcp_StatePtr8 pBytes, uint16 numBytes,struct sockaddr* client )
{
        if ((long)XcpPort==port){
                sentbytes = sendto(acceptSocket,(char*)pBytes,(long)numBytes,0, (struct sockaddr*)&client, sizeof(client));
        }
        XcpIp_TxCallback(port,(uint16)sentbytes);
}
 类似资料:
  • sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的

  • 因为笔者一直都是使用 CentOS,所以这次安装系统也是基于CentOS的安装。把光盘插入光驱,设置bios光驱启动。进入光盘的欢迎界面。也可参考Ubuntu 12.04 安装教程详细步骤。 其中有两个选项,可以直接按回车,也可以在当前界面下输入 linux text 按回车。前者是图形下安装,可以动鼠标的,后者是纯文字形式的。建议初学者用前者安装。直接回车后,出现一下界面: 这一步是要提示你是否

  • 1981 年IBM 公司推出享誉全球的微型计算机IBM PC。在1981-1991 年间,MS-DOS 操作系统一直是微型计算机上操作系统的主宰。此时计算机硬件价格虽然逐年下降,但软件价格仍然是居高不下。当时Apple 的MACs 操作系统可以说是性能最好的,但是其天价没人能够轻易靠近。 当时的另一个计算机技术阵营是Unix世界。但是Unix操作系统就不仅是价格贵的问题了。为了寻求高利率,Unix

  • 通过前面的小节学习,我们已经对 Linux 操作系统有了简单的了解,同时也在 Windows 下安装了虚拟机软件 VMware ,那么本节课我们就介绍下如何使用虚拟机软件安装 Linux 操作系统。 通过第一小节的学习我们知道 Linux 有很多的发行版本,本小节以 CentOS 8 为例来介绍 Linux 操作系统的安装步骤。学习本小节之后读者可以按照本小节的介绍步骤,安装其他的 Linux 操

  • 我最近开始学习Docker,知道它只需要一个简单的命令就可以在容器中创建和运行Ubuntu。 我还知道docker-machine使用VirtualBox以非常得心应手的方式创建Linux OS。 那么它们之间有什么区别呢?

  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成