|
|
我装的是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);
} |
|