c语言 socket单播创建,CSocket之多线程Demo(单播+多播)

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值