linux網路多線程編程執行個體

來源:互聯網
上載者:User

用的是UDP方式。
伺服器能同時接受十個用戶端,各個用戶端可以相互點對點通訊;可以對所有連到
伺服器的用戶端廣播;也可以和伺服器通訊。伺服器也可以廣播。
運行時你要先看懂原始碼中的命令: "/w " 廣播  ; "/s n " 對某個用戶端; "/sv "對伺服器;

命令是引號中的部分,注意空格。

服務端代碼:

#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <pthread.h>
#define PORT 8889
#define max_size  256
/////////////////////////////////////////////////////////
  int sockfd,sockfd2[10],ret,i=0,j,flag=0;
  struct sockaddr_in addr;
  struct sockaddr_in addr2[10];
  int unsigned addr_len =sizeof(struct sockaddr_in);
  char inbuffer[256];
  char outbuffer[256];
//char tempbuffer[256];
//int name[1];
   void  threads1();
   void  threads2();
///////////////////////////////////////////////////////
int main()
{
  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
    { perror("socket");
      exit(1);       
      }
   bzero(&addr,sizeof(addr));
   addr.sin_family=AF_INET;
   addr.sin_port=htons(PORT);
   addr.sin_addr.s_addr=htonl(INADDR_ANY);
   if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0)
   {
perror("connect");
      exit(1);
    }
pthread_t ids1;
ret=pthread_create(&ids1,NULL,(void *) &threads1,NULL);
if(ret!=0)
{
printf("綰跨▼鍒涘緩澶辮觸\n");
exit(1);
}

pthread_t ids2;
ret=pthread_create(&ids2,NULL,(void *) &threads2,NULL);
if(ret!=0)
{
printf("綰跨▼鍒涘緩澶辮觸\n");
exit(1);
}
pthread_join(ids1,NULL);
pthread_join(ids2,NULL);

   close (sockfd);
   return 1;
}
////////////////////////////////////////////////////////////
void threads1(void)
{
for(;
{
bzero(outbuffer,sizeof(outbuffer));
read(STDIN_FILENO,outbuffer,sizeof(outbuffer));
if(strncmp(outbuffer,"/w ",3)==0)//大家 說
{
strcat(outbuffer,"server said: ");
if(addr2[0].sin_port!=0)
{
for(j=0;j<=9;j++)
{
if(addr2[j].sin_port!=0)//////////////////////////轉寄給別的用戶端
{
sendto(sockfd2[j],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[j],addr_len);
perror("sendto");
}
}
}else{
printf("no clent \n");
}
}
else if(strncmp(outbuffer,"/s ",3)==0)////////////////////對某個用戶端說
{
if(strncmp(outbuffer,"/s 0 ",5)==0)
{

sendto(sockfd2[0],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[0],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 1 ",5)==0)
{

sendto(sockfd2[1],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[1],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 2 ",5)==0)
{

sendto(sockfd2[2],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[2],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 3 ",5)==0)
{

sendto(sockfd2[3],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[3],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 4 ",5)==0)
{

sendto(sockfd2[4],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[4],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 5 ",5)==0)
{

sendto(sockfd2[5],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[5],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 6 ",5)==0)
{

sendto(sockfd2[6],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[6],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 7 ",5)==0)
{

sendto(sockfd2[7],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[7],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 8 ",5)==0)
{

sendto(sockfd2[8],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[8],addr_len);
perror("sendto");
}
else if(strncmp(outbuffer,"/s 9 ",5)==0)
{

sendto(sockfd2[9],outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr2[9],addr_len);
perror("sendto");
}
}
else{
printf("error message!\n");
}
}
}
////////////////////////////////////////////////////////////
void threads2(void)
{
for(j=0;j<=9;j++)
{
    addr2[j].sin_family=AF_INET;
    addr2[j].sin_addr.s_addr=0;
    addr2[j].sin_port=0;
}
for(;{
bzero(inbuffer,sizeof(inbuffer));
      recvfrom(sockfd,inbuffer,sizeof(inbuffer),0,(struct sockaddr*)&addr,&addr_len);

        printf("receive from clent-->%s",inbuffer);
for(j=0;j<=9;j++)
{
if(addr.sin_port==addr2[j].sin_port)flag=flag+1;//////////////////////判斷 該用戶端是否已經登入

}
if(flag==0)///////////////////// 如果沒有就 記錄
{
sockfd2[i]=sockfd;
    addr2[i].sin_port=addr.sin_port;
    addr2[i].sin_addr.s_addr=addr.sin_addr.s_addr;
if(i==9)i=0;
i=i+1;
}
flag=0;
/////////////////////////////////下面 做發送前處理
if(strncmp(inbuffer,"/w ",3)==0)//對 大家 說
{
strcat(inbuffer,"a clent said to everone");
if(addr2[0].sin_port!=0)
{
for(j=0;j<=9;j++)
{
if(addr2[j].sin_port!=0&&addr2[j].sin_port!=addr.sin_port)//////////////////////////轉寄給別的用戶端
{
sendto(sockfd2[j],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[j],addr_len);
perror("sendto");
}
}
}
}
else if(strncmp(inbuffer,"/s ",3)==0)////////////////////對某個用戶端說
{
if(strncmp(inbuffer,"/s 0 ",5)==0)
{

sendto(sockfd2[0],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[0],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 1 ",5)==0)
{

sendto(sockfd2[1],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[1],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 2 ",5)==0)
{

sendto(sockfd2[2],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[2],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 3 ",5)==0)
{

sendto(sockfd2[3],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[3],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 4 ",5)==0)
{

sendto(sockfd2[4],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[4],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 5 ",5)==0)
{

sendto(sockfd2[5],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[5],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 6 ",5)==0)
{

sendto(sockfd2[6],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[6],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 7 ",5)==0)
{

sendto(sockfd2[7],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[7],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 8 ",5)==0)
{

sendto(sockfd2[8],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[8],addr_len);
perror("sendto");
}
else if(strncmp(inbuffer,"/s 9 ",5)==0)
{
sendto(sockfd2[9],inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr2[9],addr_len);
perror("sendto");
}
}
else if(strncmp(inbuffer,"/sv ",4)==0)//對 大家 說
{
printf("clent to server \n");
}
else{
bzero(inbuffer,sizeof(inbuffer));
strcpy(inbuffer,"the message error!");
sendto(sockfd,inbuffer,strlen(inbuffer),0,(struct sockaddr*)&addr,addr_len);/////如果 訊息格式不對 告訴該用戶端
perror("sendto");
}
}
}

----------------------------------------------------------------------------------------------------------------
用戶端代碼:

#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define PORT 8889
#define max_size  256
#define SERVER_IP  "127.0.0.1"
/////////////////////////////////////////////////
    int sockfd;
    struct sockaddr_in addr;
    int unsigned addr_len =sizeof(struct sockaddr_in);
    char inbuffer[256];
    char outbuffer[256];

///////////////////////////////////////////////////
void threads1();
void threads2();

int main(void)
{  
   if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
    {
       perror("socket");
       exit(1);
     }
   bzero(&addr,sizeof(addr));
   addr.sin_family=AF_INET;
   addr.sin_port=htons(PORT);
   addr.sin_addr.s_addr=inet_addr(SERVER_IP);

pthread_t ids1;
pthread_t ids2;
if(pthread_create(&ids1,NULL,(void *) & threads1,NULL)!=0)
{
printf("線程建立錯誤\n");
exit(1);
}

//pthread_mutex_init (&mutex,NULL);
if(pthread_create(&ids2,NULL,(void *) & threads2,NULL)!=0)
{
printf("線程建立錯誤\n");
exit(1);
}
pthread_join(ids1,NULL);
pthread_join(ids2,NULL);
  close(sockfd);
return 1;
}

///////////////////////////////////////////////////////////

void  threads1()
{

for(;;){
bzero(outbuffer,sizeof(outbuffer));
       fgets(outbuffer,max_size,stdin);
      sendto(sockfd,outbuffer,strlen(outbuffer),0,(struct sockaddr*)&addr,addr_len);
}
}

void  threads2()
{
for(;;){
bzero(inbuffer,sizeof(inbuffer));
recvfrom(sockfd,inbuffer,sizeof(inbuffer),0,(struct sockaddr*)&addr,&addr_len);
       printf("receive from server-->:%s \n",inbuffer);
}
}

大家小心,源碼裡面的符號可能被當成轉義.
如果編譯有錯,請自己添加上符號

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.