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就没有直接发送此类数据的功能函数吗?
请教大家,谢谢。 一样发送。
const void* data的行为在于,针对于函数lwip_send, lwip_sendto等,data在这些函数中应该是只读,不修改的。 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的内容 for(i=0;i<20;i++)
{
data_buffervv = i;
}
send(connected, data_buffervv, strlen(data_buffervv), 0);
-----
你觉得代码中strlen(data_buffervv)返回值会是多少? 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);发送也不成功? 回复【4楼】notebook
你觉得代码中strlen(data_buffervv)返回值会是多少?
-------------------------------------------------------------------------------
strlen(data_buffervv)的值是0;我这个数组内容不是字符串,谢谢提醒。
那为什么send(connected, data_buffervv, 20, 0);发送也不成功?
-----------------------------------------------------------------------
开始的时候,strlen返回0,这样肯定发送不出去。
后面这样修改应该能够发送吧,你确定依然不能发送?或者,你如何判断它并没有被发送出来。 回复【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);后设置断点,程序停不下来。 可以发送了
我没有用十六进制查看00 01 02 --------13
ASCii 码显示不出来,并非没有数据,非常感谢ffzx的耐心指导 呵呵。 mark一下
页:
[1]