notebook 发表于 2011-5-16 09:51:11

RTT中应用LWIP协议 建立TCP连接(bind socket到服务器地址) 发送数据非const数据的问题

int   lwip_send(int s, const void *data, size_t size, int flags)

intlwip_sendto(int s, const void *data, size_t size, int flags,const struct sockaddr *to, socklen_t tolen)

int   lwip_write(int s, const void *data, size_t size)

我查看建立TCP连接后的发送数据的相关函数,都是定义的const,也就是如果我定义要发送的内容是
static const char send_data[] = "This is TCP Server from STM32 RT-Thread."; /* 发送用到的数据*/

用以上的函数可以正常的发送,我用网络调试工具也接收到发送的内容.

但是我现在想发送一串数据,它是这样定义的
unsigned char data_buffervv;

for(i=0;i<20;i++)
{
   data_buffervv = i;
}

然后我想把 data_buffervv的内容发送出去,应该怎么处理?难道LWIP就没有直接发送此类数据的功能函数吗?

请教大家,谢谢。

ffxz 发表于 2011-5-16 09:59:48

一样发送。

const void* data的行为在于,针对于函数lwip_send, lwip_sendto等,data在这些函数中应该是只读,不修改的。

notebook 发表于 2011-5-16 10:39:06

char send_data2[] = "This is test code"; /* 发送用到的数据*/


void tcpserv(void)//* parameter)
{

   
   rt_bool_t result;
   int i ;
   unsigned char data_buffervv;

   
   char *recv_data;
   rt_uint32_t sin_size;
   int sock, connected, bytes_received;
   struct sockaddr_in server_addr, client_addr;
   rt_bool_t stop = RT_FALSE;   /* 停止标志*/
   recv_data = rt_malloc(1024); /* 分配接收用的数据缓冲*/
   rt_device_t dev;

   dev=rt_device_find("uart3");
   if (recv_data == RT_NULL)
    {
   rt_kprintf("No memory\n");
   return;
    }
   /* 一个socket在使用前,需要预先创建出来,指定SOCK STREAM为TCP的socket */
   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
   /* 创建失败的错误处理*/
   rt_kprintf("Socket error\n");
   /* 释放已分配的接收缓冲*/
   rt_free(recv_data);
   return;
    }

   /* 初始化服务端地址*/
    server_addr.sin_family = AF_INET;   // AF_INET == 2;
    server_addr.sin_port = htons(5000); /* 服务端工作的端口*/
    server_addr.sin_addr.s_addr = INADDR_ANY;   /* 0.0.0.0 */
    rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));
    /* 绑定socket到服务端地址*/
    if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
   {
      /* 绑定失败*/
      rt_kprintf("Unable to bind\n");
      /* 释放已分配的接收缓冲*/
      rt_free(recv_data);
      return;
   }
    /* 在socket上进行监听*/
    if (listen(sock, 5) == -1)
   {
      rt_kprintf("Listen error\n");
      /* release recv buffer */
      rt_free(recv_data);
      return;
   }
    rt_kprintf("\nTCPServer Waiting for client on port 5000...\n");
    while(stop != RT_TRUE)
   {
      sin_size = sizeof(struct sockaddr_in);
      /* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的*/
      connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
      
      rt_kprintf("connected =%d\n",connected); //markoi
      
      /* 返回的是连接成功的socket */
      /* 接受返回的client addr指向了客户端的地址信息*/
      rt_kprintf("I got a connection from (%s , %d)\n",
      inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
      /* 客户端连接的处理*/
   while (1)
      {
         /* 发送数据到connected socket */
      send(connected, send_data, strlen(send_data), 0);
      
         /* 从connected socket中接收数据,接收buffer是1024大小,但并不一定能够收到1024大小的数据*/
      bytes_received = recv(connected,recv_data, 1024, 0);
      rt_kprintf("RECIEVED_DATA = %s \n" , recv_data);
      
      
      
      


         for(i=0;i<20;i++)
         {
         data_buffervv = i;
         }
      
         

         
         send(connected, send_data2, strlen(send_data2), 0);
         send(connected, data_buffervv, strlen(data_buffervv), 0);
      
          ;
         }

      }


---------------------------------------------------


网络调试工具能收到   This is test code222222 但不能收到data_buffervv的内容

ffxz 发表于 2011-5-16 10:49:47

for(i=0;i<20;i++)
         {
         data_buffervv = i;
         }

send(connected, data_buffervv, strlen(data_buffervv), 0);

-----
你觉得代码中strlen(data_buffervv)返回值会是多少?

notebook 发表于 2011-5-16 11:26:22

for(i=0;i<20;i++)
         {
         data_buffervv = i;
         }

send(connected, data_buffervv, strlen(data_buffervv), 0);

-----
你觉得代码中strlen(data_buffervv)返回值会是多少?

-------------------------------------------------------------------------------

strlen(data_buffervv)的值是0;我这个数组内容不是字符串,谢谢提醒。
那为什么send(connected, data_buffervv, 20, 0);发送也不成功?

ffxz 发表于 2011-5-16 12:23:17

回复【4楼】notebook
你觉得代码中strlen(data_buffervv)返回值会是多少?
-------------------------------------------------------------------------------
strlen(data_buffervv)的值是0;我这个数组内容不是字符串,谢谢提醒。
那为什么send(connected, data_buffervv, 20, 0);发送也不成功?
-----------------------------------------------------------------------

开始的时候,strlen返回0,这样肯定发送不出去。

后面这样修改应该能够发送吧,你确定依然不能发送?或者,你如何判断它并没有被发送出来。

notebook 发表于 2011-5-16 12:44:28

回复【4楼】notebook   
你觉得代码中strlen(data_buffervv)返回值会是多少?
-------------------------------------------------------------------------------
strlen(data_buffervv)的值是0;我这个数组内容不是字符串,谢谢提醒。
那为什么send(connected, data_buffervv, 20, 0);发送也不成功?
-----------------------------------------------------------------------

开始的时候,strlen返回0,这样肯定发送不出去。

后面这样修改应该能够发送吧,你确定依然不能发送?或者,你如何判断它并没有被发送出来。

-----------------------------------------------------------------------------------------------

我用网络调试工具查看接收的内容,send_data2的内容可以看到。的确没有看到data_buffervv的内容。

而且我在send(connected, data_buffervv, 20, 0);后设置断点,程序停不下来。

notebook 发表于 2011-5-16 14:59:38

可以发送了

我没有用十六进制查看00 01 02 --------13

ASCii 码显示不出来,并非没有数据,非常感谢ffzx的耐心指导

mjele 发表于 2011-5-16 16:17:27

呵呵。

liuanty7 发表于 2012-9-22 09:49:44

mark一下
页: [1]
查看完整版本: RTT中应用LWIP协议 建立TCP连接(bind socket到服务器地址) 发送数据非const数据的问题