使用Seagull协议流量生成器的自定义UDP协议sendto()失败

时间:2018-07-05 23:37:41

标签: sockets networking udp network-protocols sendto

我是刚接触网络,协议和套接字的人,但是这个问题困扰了我好几天了,我似乎找不到解决方案。我正在使用Seagull(一种开放源代码多协议流量生成器(source code)来创建具有自定义UDP的客户端。不幸的是,没有人真正跟上该软件,其他人也遇到了这个问题,但是没有解决方案,并且可能是生成器软件中的错误。我能够编写运行流量生成器所需的XML脚本,当我在本地环回(127.0.0.1)上运行客户端时,生成器工作正常,我能够收集数据包并使用Wireshark对其进行分析,并且它们包含正确的数据。

我现在正尝试使用此客户端将邮件发送到本地网络(192.x.x.x)上的服务器,但是Seagull仍然无法发送邮件。这不是网络问题,因为我能够ping通地址而不会丢失数据包。我已将错误的源追溯到sendto()函数,该函数由于参数无效而一直失败。当目标设置为本地回送和其他IP且传递给sendto()函数的参数与{{1}中的IP地址不同时,我已经使用GDB逐步完成了代码}结构,这当然是可以预期的。但是,当我在sockaddr的系统调用之后查看寄存器时,其中包含消息长度长度值的那个在调用过程中变成负数,这是从函数返回的值呼叫-本地环回网络不会发生这种情况。这是调用sendto()并失败的代码部分:

sendto()

其中 size_t C_SocketWithData::send_buffer(unsigned char *P_data, size_t P_size){ // T_SockAddrStorage *P_remote_sockaddr, // tool_socklen_t *P_len_remote_sockaddr) { size_t L_size = 0 ; int L_rc ; if (m_write_buf_size != 0) { // Try to send pending data if (m_type == E_SOCKET_TCP_MODE) { L_rc = _call_write(m_write_buf, m_write_buf_size) ; } else { L_rc = _write(m_write_buf, m_write_buf_size) ; } if (L_rc < 0) { SOCKET_ERROR(0, "send failed [" << L_rc << "] [" << strerror(errno) << "]"); switch (errno) { case EAGAIN: SOCKET_ERROR(0, "Flow control not implemented"); break ; case ECONNRESET: break ; default: SOCKET_ERROR(0, "process error [" << errno << "] not implemented"); break ; } return(0); _write()的包装。

我不太确定到底发生了什么导致它做到这一点,我花了数小时来查看源代码并跟踪正在发生的事情,但是直到系统中的缓冲区长度被修改后,一切似乎都是正常的呼叫。我看过sendto()的初始化,绑定和其他函数,但是一切似乎都很好。如果有人对Seagull或此问题有任何经验,请告诉我您是否有任何建议。我已经浏览了该网站上几乎所有与socket()相关的问题,但没有找到解决方案。

我正在通过Windows 10主机上的VM(Virtualbox)在Ubuntu v 14.04上运行客户端,尝试在其中发送消息。预先感谢!

1 个答案:

答案 0 :(得分:0)

经过几天的调试和查看源代码,我找出了答案。我希望对此进行更新,以防将来任何可怜的人遇到相同的问题。原始的Seagull实现总是在调用function UpdateProduct() // called on click of an update btn { // capture id from hidden element set in editproduct function var productId = $('#txtHiddenId').val(); console.log("***** line:233 *****\n product id =" + productId); fillArray(productId); console.log("***** line:235 *****\n Fill array called!"); BindTable(); console.log("***** line:237 *****\n Bind Table called!"); } // other functions function fillArray(prodid) { console.log("***** line:310 *****\n Begin Fill Array"); // find the item in the product array and update it $.each(JSON.parse(sessionStorage.setItem('products', JSON.stringify(productArray))), function (idx, v) { console.log("***** line:315 *****\n " + product.id); // Check if current prodid is the id wanted if (product.id === prodid) {// ids match console.log("***** line:319 *****\n product is's match"); // populate data product.id = productId; product.arrivalDate = $('#modalRequestedArrivalDate').val(); product.productCode = $('#modalProductCode').val(); product.description = $('#modalDescription').val(); product.quantity = $('#modalQuantity').val(); product.quantityType = $('#modalQuantityType').val(); product.plant = $('#modalPlant').val(); product.shippingMethod = $('#modalShippingMethod').val(); product.specialInstructions = $('#modalSpecialInstructions').val(); console.log("***** line:310 *****\n END Fill Array"); } }); / send之前尝试绑定套接字。在这种情况下,由于sendto自动绑定了套接字,因此我可以删除这种情况的绑定。

C_SocketClient :: _ open的原始实现(C_Socket.cpp行666):

sendto

编辑版本:

} else {
  L_rc = call_bind(m_socket_id, 
                   (sockaddr *)(void *)&(m_remote_addr_info->m_addr_src),
                   SOCKADDR_IN_SIZE(&(m_remote_addr_info->m_addr_src)));

现在Seagull可以工作了,我可以发送自定义协议了!我打开了对原始源代码的提取请求,以便可以修复该问题。