- 論壇徽章:
- 0
|
//////////////////////////server////////////////////////////////
/*
編譯程序用下列命令:
gcc -Wall mcastclient.c -o mcastclient
gcc -Wall mcastserver.c -o mcastserver
運行程序用如下命令:
./mcastserver 230.1.1.1 7838
客戶端程序運行命令為:
./mcastclient 230.1.1.1 7838 192.168.100.1 12345
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFLEN 255
/*********************************************************************
*filename: mcastserver.c
*purpose: 演示組播編程的基本步驟,組播服務(wù)器端,關(guān)鍵在于加入組
*tidied by: zhoulifa(
zhoulifa@163.com
) 周立發(fā)(
http://zhoulifa.bokee.com
)
Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
*date time:2007-01-25 13:20:00
*Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當然包括你的商業(yè)用途
* 但請遵循GPL
*Thanks to: Google.com
*Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*********************************************************************/
int main(int argc, char **argv)
{
struct sockaddr_in peeraddr;
struct in_addr ia;
int sockfd;
char recmsg[BUFLEN + 1];
unsigned int socklen, n;
struct hostent *group;
struct ip_mreq mreq;
/* 創(chuàng)建 socket 用于UDP通訊 */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd
/* 設(shè)置要加入組播的地址 */
bzero(&mreq, sizeof(struct ip_mreq));
if (argv[1])
{
if ((group = gethostbyname(argv[1])) == (struct hostent *) 0)
{
perror("gethostbyname");
exit(errno);
}
}
else
{
printf("you should give me a group address, 224.0.0.0-239.255.255.255\n");
exit(errno);
}
bcopy((void *) group->h_addr, (void *) &ia, group->h_length);
/* 設(shè)置組地址 */
bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));
/* 設(shè)置發(fā)送組播消息的源主機的地址信息 */
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
/* 把本機加入組播地址,即本機網(wǎng)卡作為組播成員,只有加入組才能收到組播消息 */
if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(struct ip_mreq)) == -1)
{
perror("setsockopt");
exit(-1);
}
socklen = sizeof(struct sockaddr_in);
memset(&peeraddr, 0, socklen);
peeraddr.sin_family = AF_INET;
if (argv[2])
peeraddr.sin_port = htons(atoi(argv[2]));
else
peeraddr.sin_port = htons(7838);
if (argv[1])
{
if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr)
/* 綁定自己的端口和IP信息到socket上 */
if (bind(sockfd, (struct sockaddr *) &peeraddr,sizeof(struct sockaddr_in)) == -1)
{
printf("Bind error\n");
exit(0);
}
int len = 0;
len = sizeof(struct sockaddr_in);
printf("%s\n", inet_ntoa(peeraddr.sin_addr));
printf("port:%d\n", peeraddr.sin_port);
/* 循環(huán)接收網(wǎng)絡(luò)上來的組播消息 */
for (;;)
{
bzero(recmsg, BUFLEN + 1);
n = recvfrom(sockfd, recmsg, BUFLEN, 0,(struct sockaddr *) &peeraddr, &socklen);
if (n
}
///////////////////////////////client/////////////////////////////////
#include
#include
#include
#include
#include
#include
#define BUFLEN 255
/*********************************************************************
*filename: mcastclient.c
*purpose: 演示組播編程的基本步驟,其實這就是一個基本的UDP客戶端程序
*tidied by: zhoulifa(
zhoulifa@163.com
) 周立發(fā)(
http://zhoulifa.bokee.com
)
Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
*date time:2007-01-25 13:10:00
*Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當然包括你的商業(yè)用途
* 但請遵循GPL
*Thanks to: Google.com
*Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*********************************************************************/
int main(int argc, char **argv)
{
struct sockaddr_in peeraddr, myaddr;
int sockfd;
char recmsg[BUFLEN + 1];
unsigned int socklen;
/* 創(chuàng)建 socket 用于UDP通訊 */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/35065/showart_2154928.html |
|