实在没办法了求有过经验的朋友帮帮忙,这个双休日简直煎熬啊搞不粗来!!
下面是周公uCOS+UDP通讯的例程中的两个核心任务,并且我已经测试成功,【可以发送和接收】!!
但是这里的发送数据是将接收到的数据返回serv端,
而我需要的是【单独发送我想发送的数据】。
那我就想把recvfrom()去掉不就行了,可是【总是发送不出去啊】!!!
而且加了我改的发送任务后,连这个接收任务也无法执行了。。。
不知道问题所在,求高手解答,谢谢了!!!
周公的TCP/IP协议栈的socket API介绍:
http://www.docin.com/p-57998041.html
周公的TCP/IP协议栈的实现过程:
http://blog.chinaunix.net/uid-27 ... 1a374a433f596ad1440
【上面两个链接,没有用过ZLG/IP的朋友看下可以帮助理解下面的代码,以便更快解决我的问题】
/*********************************************************************************************************
** Function name: TaskB
** Descriptions: 等待UDP的信号量
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void TaskB (void *pdata)
{
void * UdpTemp;
uint8 eer;
while (1) {
UdpTemp = OSQPend(RecUdpQFlag, 0, &eer);
if (eer == OS_NO_ERR) {
Udp_Process((Rec_Ptr *)UdpTemp);
eer = eer;
}
}
}
/*********************************************************************************************************
** Function name: TaskD
** Descriptions: UDP协议数据接收和发送任务
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void TaskD (void *pdata)
{
uint8 rec_buffer[100]; /* 发送缓存区 */
SOCKET s;
int rec_coute, send_coute;
uint16 iii;
struct sockaddr servaddr, clientaddr;
OSTimeDly(60);
servaddr.sin_family = 0; /* 设置客户机IP地址 */
servaddr.sin_addr[0] = 192;
servaddr.sin_addr[1] = 168;
servaddr.sin_addr[2] = 0;
servaddr.sin_addr[3] = 55;
servaddr.sin_port = 1026; /* 设置服务器端口号 */
s=*socket(0, SOCK_DGRAM, UDP_PROTOCOL); /* 建立SOCKET */
clientaddr.sin_family = 0;
clientaddr.sin_addr[0] = NetPort[0].My_Ip[0]; /* 设置本地IP地址 */
clientaddr.sin_addr[1] = NetPort[0].My_Ip[1];
clientaddr.sin_addr[2] = NetPort[0].My_Ip[2];
clientaddr.sin_addr[3] = NetPort[0].My_Ip[3];
clientaddr.sin_port = 1025; /* 设置本地监听端口号 */
iii = bind((SOCKET * ) & s, (struct sockaddr *) & clientaddr, sizeof(clientaddr));
/* 绑定服务器地址 */
while (1) {
rec_coute=recvfrom( s, rec_buffer, 100, 0, (struct sockaddr *) & servaddr, &iii );
/* 接受数据 */
if(rec_coute > 0) {
send_coute = sendto(s, rec_buffer, rec_coute, 0,
(struct sockaddr *) & servaddr,
sizeof(servaddr) );
/* 把接受的数据返回 */
send_coute = send_coute; /* 防止编译警告 */
}
}
}
此帖出自
小平头技术问答
你好!recvfrom和sendto我都已经看的很仔细了,如果只是发送数据的话,只调用sendto理论上应该是没有问题的。
我猜想是否有这种可能:
因为测试时我用的是一款叫做【TCP&UDP测试工具】的测试软件,
那如果我要从板子发送数据到电脑,电脑端应该有相应的设置好的侦听端口才可以接收到数据。
而我使用的这个测试工具则没有这样的功能。
有没有这种可能性呢?
TCP/UDP 测试工具不能设端口号?不会吧。再说你不是测试原程序都成功了吗?
估计还是sendto不能这么直接用
肯定有端口号设置,不然的话,怎么测试 TCP 和 UDP 呢?
一周热门 更多>