Linux一對多的通訊

2021-08-18 21:16:22 字數 3941 閱讀 4206

客戶端:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define maxlen 1024

typedef

struct mysocketinfo_mysocketinfo;

void *fun_thrreceivehandler(void *socketcon);

const

char *ip="127.0.0.1";

const

int port=8888;

int main()

struct sockaddr_in server_addr;

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=inet_addr(ip);

server_addr.sin_port=htons(port);

printf("socketcon:%d\n",socketcon);

int res_con=connect(socketcon,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr));

if(res_con!=0)

printf("連線成功\n");

pthread_t thrreceive;

pthread_create(&thrreceive,null,fun_thrreceivehandler,&socketcon);

while(1)

else

if(size==0)

else

int sendmsg_len=write(socketcon,buf,size);

if(sendmsg_len>0)

else

sleep(2);

}close(socketcon);

exit(0);

}void *fun_thrreceivehandler(void *socketcon)

printf("伺服器:%s\n",buffer);

}exit(0);

}

服務端:

#include 

#include

#include

#include

#include

#include

#include

#include

#define maxlen 1024

#define maxthr 10

const

int port=8888;

const

char *service_ip="127.0.0.1";

//記錄執行緒的變數

int pthreadnum=0;

//連線到的客戶端的數量

int conclientcount=0;

typedef

struct mysocketinfo_mysocketinfo;

//struct mysocketinfo arrconsocket[10];

//接受客戶端執行緒列表

//接收到的客戶端執行緒

pthread_t arrthrreceiveclient[10];

//接受到的客戶端的數量

int thrreceiveclientcount=0;

//刪除殺死的執行緒

int delete_client(void *fp,int num)

for(i=num;i1];

}return1;}

int checkthriskill(pthread_t thr)

return res;

}void *fun_thrreceivehandler(void *socketcon)

else

if(buffer_length<0)

buffer[buffer_length]='\0';

printf("%d:%s\n",_socketcon,buffer);

sleep(1);

}printf("接受資料線程結束\n");

}void *fun_thraccepthander(void *socketlisten)

else

++conclientcount;

printf("連線套接字:%d\n",socketcon);

_mysocketinfo socketinfo;

socketinfo.socketcon=socketcon;

socketinfo.ipaddr=inet_ntoa(client_addr.sin_addr);

socketinfo.port=client_addr.sin_port;

arrconsocket[conclientcount]=socketinfo;//成功,從1開始的

//接受訊息

pthread_t thrreceive=0;

pthread_create(&thrreceive,null,fun_thrreceivehandler,&socketcon);

arrthrreceiveclient[thrreceiveclientcount]=thrreceive;

thrreceiveclientcount++;

sleep(1);

}}int main()

struct sockaddr_in addr;

addr.sin_family=af_inet;

addr.sin_port=htons(port);

addr.sin_addr.s_addr=inet_addr(service_ip);

if(bind(service_socket,(struct sockaddr*)&addr,sizeof(addr))<0)

int listen_socket=listen(service_socket,10);

if(listen_socket<0)

pthread_t thraccept[maxthr];

if(pthread_create(&thraccept[++pthreadnum],null,fun_thraccepthander,&service_socket)!=0)

sleep(1);

while(1)

conclientcount--;

for(m=thrreceiveclientcount+2;m<=pthreadnum;m++)

pthreadnum--;}}

printf("當前接受資料線程:%d\n",thrreceiveclientcount);

if(conclientcount<=0)

else

else

if(size==0)

else

for(i=0;i<=conclientcount;i++)

else}}

sleep(1);

}printf("等待子程序退出,即將退出!\n");

char *message;

int j=0;

for(j=0;jvoid*)&message);

printf("%s\n",message);

}if(sigprocmask(sig_setmask,&oldmask,null)<0)

perror("sigprocmask error\n");

printf("sigquit unblocked");

return

0;}

實現了簡單的一對多的通訊,但是其中乙個客戶端終止時,會出現,資料的不一致性,可以通過構造乙個資料結構來解決問題

網路中的一對多通訊

實現一對多的網路通訊先收藏了。客戶端 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq ...

mysql join 一對多 Join 一對多連線

資料庫常見的join方式有三種 inner join,left outter join,right outter join 還有一種full join,因不常用,本文不討論 這三種連線方式都是將兩個以上的表通過on條件語句,拼成乙個大表。以下是它們的共同點 1.關於左右表的概念。左表指的是在sql語...

MySQL關係 一對多 一對一 多對多

將實體與實體的關係,反應到最終資料庫表的設計上,將關係分為三種 一對一,一對多 多對一 和多對多,所有的關係都是表與表之間的關係 一對一 一對一 一張表的一條記錄只能與另外一條記錄進行對應,反之亦然 id p 姓名 性別 年齡 身高 婚姻狀況 籍貫 家庭位址 緊急聯絡人 體重 表設計成以上這種形式 ...