#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MCAST_PORT 8080
#define SERV_PORT 8080
#define PORT 8080
#define MCAST_ADDR "224.2.3.4"
#define LOCALHOST "127.0.0.1"
#define MAX_MSG_SIZE 1024
#define MAXLENGTH 1024
#define BACKLOG 5
void udp_receive_thread(){
struct sockaddr_in mcast_addr;
int sock_m;
struct sockaddr_in addr;
int addrlen;
int n;
char msg[MAX_MSG_SIZE];
sock_m=socket(AF_INET,SOCK_DGRAM,0);
if (sock_m<0){
fprintf(stderr,"Socket error!\n");
exit(EXIT_FAILURE);
}
bzero(&mcast_addr,sizeof(mcast_addr));
//mcast_addr.sin_family = AF_INET;
//mcast_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//设置接受任意地址
if
(inet_pton(AF_INET,"0.0.0.0",&mcast_addr.sin_addr)<0){
//设置接收地址MCAST_ADDR
fprintf(stderr,"inet_pton error!\n");
exit(EXIT_FAILURE);
}
mcast_addr.sin_port=htons(MCAST_PORT);
bind(sock_m,(struct sockaddr*)&mcast_addr,
sizeof(mcast_addr));
int loop=1;
setsockopt(sock_m,IPPROTO_IP,
IP_MULTICAST_LOOP,&loop, sizeof(int));
//设置回环许可
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sock_m, IPPROTO_IP,
IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));
//TODO
n=recvfrom(sock_m,msg,MAX_MSG_SIZE,0,(struct sockaddr_in
*)&addr,&addrlen);
printf("Receive Message: %s\n",msg);
n=recvfrom(sock_m,msg,MAX_MSG_SIZE,0,(struct sockaddr_in
*)&addr,&addrlen);
printf("Receive Message: %s\n",msg);
setsockopt(sock_m, IPPROTO_IP,
IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));
close(sock_m);
}
int read_all(int fd,void *buf,int n){
int nleft,nbytes;
char *ptr=buf;
nleft=n;
while(nleft>0){
nbytes=read(fd,ptr,nleft);
if (nbytes<0){
if (errno==EINTR){
nbytes=0;
}
else{
return -1;
}
}
else{
if (nbytes==0){
break;
}
}
nleft-=nbytes;
ptr+=nbytes;
}
return n-nleft;
}
void tcp_receive_thread(){
int sock;
struct sockaddr_in servaddr;
//建立一个TCPsocket
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0){
fprintf(stderr,"Socket Create error!\n");
exit(EXIT_FAILURE);
}
//地址初始化,置0
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(PORT);
int flag=1;
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
&flag, sizeof(flag)) <0){
perror("setsockopt");
exit(EXIT_FAILURE);
}
//绑定套接字
if (bind(sock,(struct sockaddr
*)&servaddr,sizeof(servaddr))<0){
fprintf(stderr,"Bind error!\n");
exit(EXIT_FAILURE);
}
if (listen(sock,BACKLOG)<0){ //设置侦听套接字
fprintf(stderr,"Listen error\n");
exit(EXIT_FAILURE);
}
//TODO
int conn=accept(sock,NULL,NULL);
if (conn<0){
fprintf(stderr,"Accept error!\n");
exit(EXIT_FAILURE);
}
int nbytes;
char buf[MAXLENGTH];
if
(nbytes=read_all(conn,buf,MAXLENGTH)<0){
fprintf(stderr,"read error!\n");
exit(EXIT_FAILURE);
}
int i;
printf("Request: ");
for (i=0;i
printf("%c",buf[i]);
if (buf[i]=='\0'){
printf("\n");
break;
}
}
printf("\n");
close(conn);
close(sock);
}
int write_all(int fd,void *buf,int n){
int nleft,nbytes;
char *ptr;
nleft=n;
ptr=buf;
for (;nleft>0;){
nbytes=write(fd,ptr,nleft);
if (nbytes<=0){
if (errno==EINTR){
nbytes=0;
}
else{
return -1;
}
}
nleft-=nbytes;
ptr+=nbytes;
}
return n;
}
void tcp_send_thread(){
int sock;
struct sockaddr_in servaddr;
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0){
fprintf(stderr,"Socket error!\n");
exit(EXIT_FAILURE);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
if
(inet_aton("127.0.0.1",&servaddr.sin_addr)==0){
//设置服务器地址
fprintf(stderr,"Inet_aton error\n");
exit(EXIT_FAILURE);
}
if (connect(sock,(struct sockaddr
*)&servaddr,sizeof(servaddr))<0){
//建立TCP连接
fprintf(stderr,"Connect error!\n");
exit(EXIT_FAILURE);
}
char buf[MAXLENGTH];
printf("Input TCP message:\n");
while (gets(buf)==NULL){
}
write_all(sock,buf,sizeof(buf));
write_all(sock,'\0',1);
close(sock);
}
void send_multi_thread(){
int sock_m;
struct sockaddr_in mcast_addr;
struct sockaddr_in addr;
char buf[MAX_MSG_SIZE];
int n;
sock_m=socket(AF_INET,SOCK_DGRAM,0);
if (sock_m<0){
fprintf(stderr,"Socket error!\n");
exit(EXIT_FAILURE);
}
bzero(&mcast_addr,sizeof(mcast_addr));
bzero(&mcast_addr,sizeof(addr));
mcast_addr.sin_family = AF_INET;
mcast_addr.sin_addr.s_addr=inet_addr(MCAST_ADDR);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr=inet_addr(LOCALHOST);
mcast_addr.sin_port=htons(MCAST_PORT);
//TODO
printf("Input MCAST Message:\n ");
while (gets(buf)==NULL){
}
sendto(sock_m,buf,strlen(buf),0,&mcast_addr,sizeof(mcast_addr));
close(sock_m);
}
void send_single_thread(){
int sock;
struct sockaddr_in addr;
sock=socket(AF_INET,SOCK_DGRAM,0);
if (sock<0){
fprintf(stderr,"Socket error!\n");
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(SERV_PORT);
if
(inet_aton(LOCALHOST,addr.sin_addr)<0){
fprintf(stderr,"inet_aton error!\n");
exit(EXIT_FAILURE);
}
char buf[MAX_MSG_SIZE];
int n;
printf("Input Message:\n");
while (gets(buf)==NULL){
}
sendto(sock,buf,strlen(buf),0,&addr,sizeof(addr));
}
int main(void) {
pthread_t
pth_udp_receive,pth_tcp_receive,pth_multi_send,pth_single_send,pth_tcp_send;
if (pthread_create(&pth_udp_receive,NULL,(void
*)udp_receive_thread,NULL)!=0){
fprintf(stderr,"Create Error!\n");
exit(EXIT_FAILURE);
}
if (pthread_create(&pth_tcp_receive,NULL,(void
*)tcp_receive_thread,NULL)!=0){
fprintf(stderr,"Create Error!\n");
exit(EXIT_FAILURE);
}
sleep(1);
if (pthread_create(&pth_multi_send,NULL,(void
*)send_multi_thread,NULL)!=0){
fprintf(stderr,"Create Error!\n");
exit(EXIT_FAILURE);
}
if (pthread_create(&pth_single_send,NULL,(void
*)send_single_thread,NULL)!=0){
fprintf(stderr,"Create Error!\n");
exit(EXIT_FAILURE);
}
if (pthread_create(&pth_tcp_send,NULL,(void
*)tcp_send_thread,NULL)!=0){
fprintf(stderr,"Create Error!\n");
exit(EXIT_FAILURE);
}
pthread_join(pth_single_send,NULL);
pthread_join(pth_multi_send,NULL);
pthread_join(pth_tcp_send,NULL);
pthread_join(pth_tcp_receive,NULL);
pthread_join(pth_udp_receive,NULL);
return EXIT_SUCCESS;
}