Netexpert FAQ 网络分析专家学习建议入口 @netexpert成员申请指南
网络分析时代 netexpert积分规则的说明 Netis招贤纳士(2008年11月22日更新)
发新话题
打印

linux下调试udpclient程序错误?

linux下调试udpclient程序错误?

程序来源:《TCP/IP网络实验程序篇》  p123  ISBN: 7-03-011207-5    科学出版社
源代码(部分):  如果需要可以全部贴上
        /*检索服务器IP地址*/
        if((dst_ip = inet_addr(argv[DST_IP])) == INADDR_NONE)
                {
                        struct hostend *he;        /*主机信息*/
43                        if((he = gethostbyname(argv[DST_IP])) == NULL)
44                                {
45                                        fprintf(stderr, "gethostbyname error \n");
46                                        exit(EXIT_FAILURE);       
47                                }
48                        memcpy((char *)&dst_ip, (char *)he->h_addr, he->h_length);
                }
               
        /*检索服务器端口号*/       
        if(argc==3)
        {
54                if((port = atoi(argv[DST_PORT]))== 0 )
55                        {
56                                struct servent *se;   /* 服务信息 */
57                                if((se = getservbyname(argv[DST_PORT],"udp"))!=NULL)
                                        port = (int)ntohs((u_short)se->s_port);
                                else
                                        {
                                                fprintf(stderr, "getservbyname error \n");
                                                exit(EXIT_FAILURE);       
                                        }
                        }
        }

调试:
gcc udpclient.c -o udpclient
错误:
udpclient.c: In function `main':
udpclient.c:40: warning: passing arg 1 of `inet_addr' from incompatible pointer
type
udpclient.c:43: warning: passing arg 1 of `gethostbyname' from incompatible pointer type
udpclient.c:43: warning: assignment from incompatible pointer type
udpclient.c:48: dereferencing pointer to incomplete type
udpclient.c:48: dereferencing pointer to incomplete type
udpclient.c:54: warning: passing arg 1 of `atoi' from incompatible pointer type
udpclient.c:57: warning: passing arg 1 of `getservbyname' from incompatible pointer type

请仁兄指教!

[ 本帖最后由 lyd 于 2007-7-18 10:13 编辑 ]
除了努力,我们别无选择!

TOP

提示信息说你argv[DST_IP]不正常,你的argv[DST_IP]是什么?检查数据类型。需要大力加强基础知识了。
说了世上一无牵挂为何有悲喜
说了朋友相交如水为何重别离
说了少年笑看将来为何常回忆
说了青春一去无悔为何还哭泣

TOP

DST_IP是指目标IP,是这样定义的的:enum {CMD_NAME, DST_IP, DST_PORT};是作为运行的参数。
在另一个程序中也有类似的:enum {CMD_NAME,START_IP,LAST_IP}和inet_addr(argv[START_IP]),编译是没有问题的,运行也没有问题。

另外还有一个结构体问题:
在一个程序中有如下代码:
struct packet_udp
{
        struct ip ip;
        struct udphdr udp;
};

int main(int argc, char *argv[])
{
        struct packet_udp sendpacket;

调试运行没有问题!
在另一文件中也有类似的代码:
struct packet_tcp
{
        struct ip ip;
        struct tcphdr tcp;
        u_char data [MAXDATA];
};
int main(int argc,char *argv[])
{
    struct pakcet_tcp send;

调试提示错误:
tcpsyn.c:42: storage size of `send' isn't known;
除了努力,我们别无选择!

TOP

第一个问题检查头文件是否正确包含。排查时可以动用强制类型转换,( char * )

第二个问题你找个懂点的人去你座位上帮你调吧,这种编译问题(那不叫调试)一般都是些极其低级的错误所致,在没有足够上下文的情况下瞎讨论也于事无补。我瞎猜一下,你少了一个头文件,导致u_char这个typedef缺失,或者MAXDATA这个宏缺失,现在你换成unsigned char data[1024],再试。因为没有足够上下文,这类问题非常不适合在网上讨论,太浪费时间。再就是你把那个send换个名字,比如写成sendpacket。
说了世上一无牵挂为何有悲喜
说了朋友相交如水为何重别离
说了少年笑看将来为何常回忆
说了青春一去无悔为何还哭泣

TOP

谢谢你的建议。
除了努力,我们别无选择!

TOP

发新话题
版块跳转