#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聊天功能
于 2019-12-25 20:50:55 首次发布