#include <myhead.h>
#define IP "192.168.2.255" //接收广播IP
#define PORT 17688 //广播端口
#define GIP "192.168.2.200"//服务器IP
#define GPORT 17688 //服务器端口
#define ERR_MSG(msg) do{\
fprintf(stderr,"line:%d file:%s fun:%s",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0);
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
int sfd1=socket(AF_INET,SOCK_DGRAM,0);
if(sfd1<0)
{
ERR_MSG("socket");
return -1;
}
//
printf("create socket success\n");
int c=1;
socklen_t len=sizeof(c);
setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&c,len);
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
{
ERR_MSG("setsockopt");
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(GIP);
char buf2[128] = "";
char buf[128]= "";
char buf1[128]= "";
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(PORT);
cin.sin_addr.s_addr = inet_addr(IP);
//绑定
if(bind(sfd1,(struct sockaddr*)&cin,sizeof(cin))<0)
{
ERR_MSG("bind");
return -1;
}
pid_t pid =fork();
while(1){
if(pid==0)
{
// char buf[128]="";
while(1)
{
// char buf[128]="";
strcpy(buf,"");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("send");
return -1;
}
//printf("send success\n ");
if(buf[0]=='Q')
{
printf("您已退出聊天室\n");
break;
}
}
exit(0);
}else if(pid>0)
{// char buf1[128]="";
while(1)
{
strcpy(buf1,"");
// fgets(buf1,sizeof(buf1),stdin);
// buf1[strlen(buf1)-1]='\0';
if(recvfrom(sfd1,buf1,sizeof(buf1),0,NULL,NULL)<0)
{
ERR_MSG("send");
return -1;
}
printf("%s\n ",buf1);
}
}else
{
return -1;
}
}
//发送
//关闭套接字文件描述符
//waitpid(-1,NULL,0);
close(sfd);
return 0;
}
UDP网络聊天室客户端
最新推荐文章于 2023-07-04 22:05:41 发布
该程序创建了两个UDP套接字,一个用于发送广播,一个用于接收。它设置了广播选项,绑定了服务器IP和端口,然后在子进程中持续接收用户输入并发送到服务器,父进程则负责接收数据并打印。当接收到特定退出指令时,子进程会退出。
摘要由CSDN通过智能技术生成