尊敬的 TI 团队:
我有一个与 Tiva tm4c1294ncpdt 板的套接字编程相关的问题。
我正在尝试运行从互联网上获得的基于套接字的 UDP 编程的简单代码。
代码为:
/*
udpclient.c -简单的 UDP 客户端
*用法:udpclient
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 1024
//
*错误- perror 的包装器
*/
void 错误(char *msg){
镜(msg);
退出(0);
}
空 tcpHandler (UArg0、UArgarg1){
int sockfd、portno、n;
int serverlen;
struct sockaddr_in serveraddr;
struct hostent *server;
char *主机名;
字符 buf[BUFSIZE];
/*检查命令行参数*/
if (argc!= 3){
fprintf (stderr、"用法:%s \n"、argv[0]);
退出(0);
}
主机名= argv[1];
PORTNO = atoi (argv[2]);
/*套接字:创建套接字*/
sockkfd = socket (AF_iNet、SOCK_DGRAM、0);
if (sockkfd < 0)
错误("打开套接字时出错");
/* gethostbyname:获取服务器的 DNS 条目*/
服务器= gethostbyname (主机名);
if (server == NULL){
fprintf (stderr、"错误、没有像%s\n"这样的主机、主机名);
退出(0);
}
/*构建服务器的 Internet 地址*/
bzero ((char *)&serveraddr、sizeof (serveraddr));
serveraddr.sin 系列= AF_iNet;
bcopy ((char *) server->h_addr、
(char *)&serveraddr.sin addr.s_addr、server->h_length);
serveraddr.sin 端口= htons (portno);
/*从用户获取消息*/
bzero (buf、BUFSIZE);
printf ("请输入 msg:");
Fgets (buf、BUFSIZE、stdin);
/*将消息发送到服务器*/
serverlen = sizeof (serveraddr);
N = sendto (sendkff、buf、strlen (buf)、0、&serveraddr、 服务器 len);
如果(n < 0)
错误("sendto 中的错误");
/*打印服务器的回复*/
N = recvfrom (sockkfd、buf、strlen (buf)、0、&serveraddr、 服务器长度(&S);
如果(n < 0)
错误("recvfin"中的错误);
printf ("来自服务器的回显:%s"、buf);
返回0;
}
我从以下网站获得:
www.cs.cmu.edu/.../udpclient.c
现在、当我运行该代码时、我会遇到很多错误、这是与函数 gethostbyname 相关的所有函数中的第一个。 这说明它 没有定义、因此我想知道我如何在代码中访问此函数、因为 TI-NDK 支持 BSD 样式的网络套接字、所以我可以使用 gethostbyname 运行此代码。
现在、为了成功构建代码、我对代码进行了以下更改:
空 tcpHandler (UARg arg0、UARg arg1)
{
int sockfd、portno、n;
int serverlen;
struct sockaddr_in serveraddr;
struct hostent *server;
char *主机名;
字符 buf[BUFSIZE];
/*检查命令行参数*/
主机名="192.168.80.171";
PORTNO = 8888;
/*套接字:创建套接字*/
sockkfd = socket (AF_iNet、SOCK_DGRAM、0);
if (sockkfd < 0)
错误("打开套接字时出错");
/* gethostbyname:获取服务器的 DNS 条目*/
/*server = gethostbyname (hostname);
if (server == NULL){
fprintf (stderr、"错误、没有像%s\n"这样的主机、主机名);
EXIT (0);
}*/
/*构建服务器的 Internet 地址*/
bzero ((char *)&serveraddr、sizeof (serveraddr));
serveraddr.sin 系列= AF_iNet;
/*bcopy ((char *) server->h_addr、
(char *)&serveraddr.sin_addr.s_addr、server->h_length);*/
serveraddr.sin_addr.s_addr = inet_addr (主机名);
serveraddr.sin 端口= htons (portno);
/*从用户获取消息*/
bzero (buf、BUFSIZE);
printf ("请输入 msg:");
Fgets (buf、BUFSIZE、stdin);
/*将消息发送到服务器*/
serverlen = sizeof (serveraddr);
N = sendto (sendkff、buf、strlen (buf)、0、&serveraddr、 服务器 len);
如果(n < 0)
错误("sendto 中的错误");
/*打印服务器的回复*/
N = recvfrom (sockkfd、buf、strlen (buf)、0、&serveraddr、 服务器长度(&S);
如果(n < 0)
错误("recvfin"中的错误);
printf ("来自服务器的回显:%s"、buf);
返回0;
}
但是、此代码崩溃显示了这一点:
启动 TCP 回显示例 系统提供商的闪存中的 SS 设置为 SysMin。 停止目标以查看 ROV 中的任何 SysMin 内容。 网络已添加:IF-1:192.168.80.154 OS.KNL.Task:第383行:E_spOutOfBounds:任务0x20000d08堆栈错误、SP = 0x3e8。 xdc.runtime.Error.raise:终止执行
我使用了 tcpecho 代码、删除了 tcpHandler 函数中的所有内容、并将代码内容放在站点的主函数中、如代码中所示。
因此,请告诉我这一切的目的是什么,如果有人想模拟条件,而不是所有需要做的事情,就是用上述代码替换 tcpHandler 的内容,或者按原样复制上述代码。
请告诉我这些问题的产生原因,我在调试过程中知道的一件事是,尽管 NDK 支持 BSD 套接字,但我们仍然无法使用在 Linux 上运行的示例代码。
此致