資源簡介
基于C語言 利用TCP/UDP協(xié)議實現(xiàn)收發(fā)消息、文件上下線提醒等

代碼片段和文件信息
#include?“myhead.h“
#include?“kernel_list.h“
struct?client?*head?=?NULL;//鏈表頭
struct?client
{
int?connfd;//套接字
char?port[100];//端口
char?ip[100]?;//IP
char?my_name[100];//用戶名
struct?list_head?list;//小結(jié)構(gòu)體
};
pthread_mutex_t?mutex?=?PTHREAD_MUTEX_INITIALIZER;//初始化鎖
//=====================初始化=================================//
struct?client?*init_list(void)
{
struct?client?*head?=?malloc(sizeof(struct?client));
if?(head?!=?NULL)
?{
? INIT_LIST_HEAD(&head->list);
?}?
?return?head;
}
bool?find(char?name[]char?port[])
{
struct?list_head?*pos;
struct?client?*tmp;
list_for_each(pos&head->list)
{
tmp?=?list_entry(posstruct?clientlist);
if?(strcmp(tmp->my_namename)?==?0?&&?strcmp(tmp->portport)?==?0)
{
return?true;
}
}
return?false;
}
void?*receive_radio(void?*arg)??//接收廣播
{
//1、創(chuàng)建udp套接字
int?fd?=?socket(AF_INETSOCK_DGRAM0);
//2、設(shè)置端口重用
int?on?=?1;
setsockopt(fdSOL_SOCKETSO_REUSEADDR&onsizeof?on);
//3、綁定本地IP+PORT
struct?sockaddr_in?srvaddrcliaddr;
bzero(&srvaddrsizeof(srvaddr));
srvaddr.sin_family?=?AF_INET;
srvaddr.sin_port?=?htons(58888);
srvaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);?
bind(fd(struct?sockaddr?*)&srvaddrsizeof(srvaddr));
//4、接收數(shù)據(jù)
char?msg[100];
char?name[100];
char?port[100];
socklen_t?len?=?sizeof(cliaddr);
printf(“用戶上下線提醒\n“);
while(1)
{
bzero(msg100);
bzero(name100);
bzero(port100);
int?data?=?recvfrom(fdmsgsizeof(msg)0(struct?sockaddr?*)&cliaddr&len);
if?(data?==?-1)
{
perror(“廣播接收失敗!“);
exit(-1);
}
sscanf(msg“%s?%s“portname);
//printf(“%s\n“?msg);
if?(strstr(msg“Go?online“)?!=?NULL)
{
struct?client?*new?=?malloc(sizeof(struct?client))?;
if?(find(nameport)?==?false)
{
strcpy(new->ipinet_ntoa(cliaddr.sin_addr));
strcpy(new->my_namename);
new->connfd?=?fd;
strcpy(new->portport);
pthread_mutex_lock(&mutex);
list_add_tail(&new->list&head->list);
pthread_mutex_unlock(&mutex);
printf(“%s\n“?msg);
}
}
if?(strstr(msg“downline“)?!=?NULL)
{
bzero(name100);
sscanf(msg“%s“name);
struct?list_head?*pos*n;
struct?client?*tmp;
list_for_each_safe(posn&head->list)
{
tmp?=?list_entry(posstruct?clientlist);
if?(strcmp(tmp->my_namename)?==?0)
{
pthread_mutex_lock(&mutex);
list_del_init(&tmp->list);
pthread_mutex_unlock(&mutex);
printf(“%s\n“?msg);
break;
}
}
}
//sleep(1);
}
//5、關(guān)閉套接字
close(fd);
pthread_exit(NULL);
}
void?*send_broadcast(void?*arg)??//發(fā)送廣播
{
char?*buf?=?(char?*)arg;
//1、創(chuàng)建udp套接字
int?fd?=?socket(AF_
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-08-09?15:28??簡易飛秋\
?????文件???????12018??2018-08-09?10:03??簡易飛秋\1.txt
?????文件?????2950470??2018-04-19?14:55??簡易飛秋\2.pdf
?????目錄???????????0??2018-08-09?20:09??簡易飛秋\bin\
?????文件???????21552??2018-08-09?09:20??簡易飛秋\bin\.fuse_hidden0000017300000089
?????文件???????21552??2018-08-09?09:59??簡易飛秋\bin\.fuse_hidden000001770000008d
?????文件???????21552??2018-08-09?20:09??簡易飛秋\bin\ljx
?????目錄???????????0??2018-08-09?11:19??簡易飛秋\file\
?????目錄???????????0??2018-08-09?08:53??簡易飛秋\include\
?????文件????????7422??2016-09-08?10:03??簡易飛秋\include\kernel_list.h
?????文件?????????497??2018-08-02?14:20??簡易飛秋\include\myhead.h
?????文件??????????81??2018-08-09?09:03??簡易飛秋\makefile
?????目錄???????????0??2018-08-09?11:24??簡易飛秋\src\
?????文件???????17020??2018-08-09?11:24??簡易飛秋\src\main.c
?????文件?????????162??2018-08-09?15:28??簡易飛秋\~$項目說明.doc
?????文件?????2659328??2018-08-09?09:52??簡易飛秋\項目說明.doc
- 上一篇:mfc工資管理系統(tǒng).rar
- 下一篇:用于人臉識別的lbp算法C++源碼
評論
共有 條評論