LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 728|回复: 2

请问为何这段网络程序只在Mandriva下出错!

[复制链接]
发表于 2006-1-7 18:11:43 | 显示全部楼层 |阅读模式
我装的是Mandriva2006 Free,
在上面跑这段程序老是出错,但在其他的发行版上总是对的,不知为何,希望有高人可以指点一下:)

错误是这样的:
就是一个server程序和一个client程序, 用loop地址(127.0.0.1),client向server发送一个字符串,于是server在rds函数里面的while(1)循环中,收到client发过来的字符串后,打印字符串正常,但再打印client的Protocol Family, IP和Port,但老是打印不出这三个的正确值,但这个程序在其他Linux发型版上运行正常!
另外注意到,在ethereal抓的包里面,说是udp 的 check sum incorrect,不知道有什么关系。

不知道是mandriva的配置问题,还是我对udp socket编程没有考虑周全?还请大家指教阿,实在不想重装系统阿,

程序如下:

server 侧:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/socket.h>
#include <netinet/in.h> // Internet related

const int SERVER_PORT = 8888;
const int MAX_MESSAGE_SIZE = 1024;

void rds(int sock);
void die(char* msg);

struct PC {
        int pcNo;
        int status; //0 free, 1 taken, 2 booked
        char viewerName[20];
        int viewerIP;
        int viewerPort;
       
};

struct PCs {
        struct PC pc1;
        struct PC pc2;
        struct PC pc3;
};



void rds(int sock) {
        struct sockaddr_in addr;
        int bytes, addrLen;
        char msg[MAX_MESSAGE_SIZE];
        struct PCs pcs;

        while (1) {
                if ((bytes = recvfrom(sock, msg, MAX_MESSAGE_SIZE, 0,
                                (struct sockaddr*)&addr, (socklen_t*)&addrLen))
                                < 0)
                        die("recvfrom()");
                msg[bytes] = '\0';
               
                printf("%s\n", msg);
                printf("Fa: %d\n", addr.sin_family);
                printf("IP: %s\n", inet_ntoa(addr.sin_addr));
                printf("port: %d\n", ntohs(addr.sin_port));
                if (msg[0] == '1')
                        if (sendto(sock, "O", 1, 0, (struct sockaddr*)&addr,
                                                addrLen) < 0)
                                die("sendto()");

               
        }
               

}

void die(char* msg) {
        perror(msg);
        exit(1);
}

main() {
        int sock = 0;
        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
                die("socket()");
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        addr.sin_port = htons(SERVER_PORT);
       
        int b;
        if ((b = bind(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr))) < 0)
                die("bind()");
       
        rds(sock);
}

       
client 侧:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/socket.h> // Network related functions and consts
#include <netinet/in.h> // Internet related functions and consts
const char SERVER_ADDR[] = "127.0.0.1";
const int SERVER_PORT = 8888;
const int CLIENT_PORT = 6666;
const int MAX_MESSAGE_SIZE = 1024;

const char GETINFO = '1';
const char TAKE    = '2';
const char BOOK    = '3';
const char HOLD    = '4';


void rdv(int sock);
void die(char* msg);


void rdv(int sock) {
        struct sockaddr_in addr;
        int bytes, addrLen;
        char msg[MAX_MESSAGE_SIZE];

        char data[] = "how are you doing!\n\0";
        printf("%s\n%s\n%s\n",
                        "****************************************",
                        "* Welcome to RemoteDesktopViewer Demo! *",
                        "****************************************");

        while (1) {
               
                printf("Getting the test bed information from server...\n");
                printf("%d\n", sizeof(GETINFO));
                if (send(sock, data, sizeof(data), 0) < 0)
                        die("send()");
                if (recv(sock, msg, MAX_MESSAGE_SIZE, 0) < 0)
                        die("recv()");
                printf("%s\n", msg);
                sleep(2);


        }
               

}

void die(char* msg) {
        perror(msg);
        exit(1);
}

main() {
        int sock = 0;
        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
                die("socket()");

        struct sockaddr_in myAddr;
        memset(&myAddr, 0, sizeof(myAddr));
        myAddr.sin_family = AF_INET;
        myAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        myAddr.sin_port = htons(CLIENT_PORT);
        if (bind(sock, (struct sockaddr*)&myAddr, sizeof(struct sockaddr)) < 0)
                die("bind()");

        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
        addr.sin_port = htons(SERVER_PORT);
        if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr)) < 0)
                die("connect()");

       
        rdv(sock);
}
发表于 2006-1-7 19:46:13 | 显示全部楼层
recvfrom函数的最后一个参数需要初始化一下。你可以用man recvfrom看到这个函数的文档。
在你的程序里面,server端调用recvfrom之前,需要 addrLen = sizeof(struct sockaddr_in)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-7 20:31:47 | 显示全部楼层
多谢仁兄,这个问题请教了公司几个人都不知道,头疼几天了,多谢啦,
前些天装Linux Programming Manual装不上,看来确实要好好看看那个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表