#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <pthread.h>
void *recever(void *arg)//接收线程
{ int fd1 = (int)arg; printf("fd1 = %d\n",fd1); while (1) { char buf[128] = ""; char ip_str[16] = ""; struct sockaddr_in from_addr; socklen_t socklen = sizeof(from_addr); ssize_t ret = recvfrom(fd1,buf,sizeof(buf),0,(struct sockaddr *)&from_addr,&socklen); if(ret < 0) { perror("recvfrom:"); break; } inet_ntop(AF_INET,&from_addr.sin_addr.s_addr,ip_str,16); printf("%s %u %s \n",ip_str,ntohs(from_addr.sin_port),buf); }
}
void *sende*r(void *arg)//发送线程
{ char ip_str[16] = ""; unsigned short port = 0; int fd1 = (int)arg; printf("fd1 = %d\n",fd1); char buf[128] = ""; char *buf_p = fgets(buf,sizeof(buf),stdin);//fgets能获取换行符
buf[strlen(buf)-1] = '\0'; struct sockaddr_in dst_addr; while (1) { if(strncmp(buf,"sayto",strlen("sayto")) == 0) { bzero(&dst_addr,sizeof(dst_addr)); dst_addr.sin_family = AF_INET; sscanf(buf,"sayto %s %hu",ip_str,&port); inet_pton(AF_INET,ip_str,&dst_addr.sin_addr.s_addr); dst_addr.sin_port = htons(port);
sendto(fd1,"hello",strlen("hello"),0,(struct sockaddr *)&dst_addr,sizeof(dst_addr)); continue; } else { sendto(fd1,buf,strlen(buf),0,(struct sockaddr *)&dst_addr,sizeof(dst_addr));
} } }
int main(int argc,char *argv[])
{
//创建回收资源 void *arg = NULL;
//创建一个用于通信套接字
int fd = socket(AF_INET,SOCK_DGRAM,0);
printf("fd = %d\n",fd);
//绑定固定的ip 和端口
struct sockaddr_in my_addr;
bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(8080);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定本地主机所有ip
bind(fd,(struct sockaddr *)&my_addr,sizeof(my_addr)); //创建接收和发送线程
pthread_t receve,send; pthread_create(&receve,NULL,recever,(void *)fd); pthread_create(&send,NULL,sender,(void *)fd); //回收线程资源
pthread_join(receve,&arg); pthread_join(send,&arg);
//关闭套接字
close(fd); return 0;}
```*
实现简单QQ聊天功能
猜你喜欢
转载自blog.csdn.net/lj19990824/article/details/103705400
今日推荐
周排行