我是刚接触网络,协议和套接字的人,但是这个问题困扰了我好几天了,我似乎找不到解决方案。我正在使用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上运行客户端,尝试在其中发送消息。预先感谢!
答案 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可以工作了,我可以发送自定义协议了!我打开了对原始源代码的提取请求,以便可以修复该问题。