1. 程式人生 > >網絡編程2.0

網絡編程2.0

soc sadd sort != socket strcpy sizeof got ()

代碼1:服務器端:

  1 #include "common.h"
  2 typedef struct stu
  3 {
  4     int id;
  5     char name[20];
  6     int score;
  7     struct stu *next;
  8 }Stu,*PStu;
  9 
 10 void fun(int sig)
 11 {
 12     printf("連接中斷\n");
 13     return;
 14 }
 15 unsigned int ListLength(PStu ptr)  //計算鏈表長度
 16 {
 17     unsigned int
l=0; 18 while(ptr!=NULL) 19 { 20 l++; 21 ptr=ptr->next; 22 } 23 return l; 24 } 25 PStu ListSort(PStu ptr) //鏈表排序 26 { 27 PStu sorthead=NULL;//創建頭指針指向空 28 unsigned int l=ListLength(ptr); 29 while(l>0) 30 { //循環找出最大值 31 PStu p1=ptr;
32 PStu p2=p1; 33 int max=p1->score; 34 while(p1!=NULL) 35 { 36 if(p1->score>max) 37 {max=p1->score; p2=p1;} 38 p1=p1->next; 39 } 40 PStu p3=ptr; 41 if (p3==p2) 42 ptr=p3->next;//
第一個為最大值時,刪除最大值。 43 else 44 { while(p3->next!=p2) 45 p3=p3->next;//定位到最大值節點p2前面一個節點 46 47 p3->next=p2->next;//(刪除最大值) 48 } 49 50 PStu r;// 後插法,由大到小 51 p2->next=NULL; 52 if(sorthead==NULL) 53 sorthead=p2; 54 else 55 r->next=p2; 56 57 r=p2; 58 l--; 59 } 60 return sorthead; 61 } 62 void show(PStu head)//打印函數 63 { 64 printf("學號\t姓名\t分數\n"); 65 while(head!=NULL) 66 { 67 printf("%d\t%s\t%d\n",head->id,head->name,head->score); 68 head=head->next; 69 } 70 return ; 71 } 72 void *thread(void *agv)//打印所接受到的信息(子線程) 73 { 74 PStu head=NULL; 75 Stu *ptr; 76 PStu r; 77 int nfd; 78 int ret; 79 nfd=(int)agv;//接收傳參nfd 80 81 signal(SIGPIPE,fun); 82 printf("read...\n"); 83 while(1) 84 { 85 ptr=malloc(sizeof(Stu)); 86 ret=read(nfd,ptr,sizeof(Stu)); 87 if(ret<0) 88 { 89 perror("read");break; 90 } 91 if(ret==0) 92 { 93 head=ListSort(head); 94 show(head); 95 printf("read over\n"); 96 break; 97 } 98 if(ret>0);//把鏈表讀出來 99 { 100 ptr->next=NULL; 101 if(head==NULL) 102 { 103 head=ptr; 104 } 105 else 106 { 107 r->next=ptr; 108 } 109 r=ptr; 110 } 111 } 112 return NULL; 113 } 114 115 int main()//主線程,一直工作,接收客戶端 116 { 117 PStu head=NULL; 118 pthread_t pthid; 119 int ret; 120 int fd,nfd; 121 struct sockaddr_in saddr,caddr; 122 int addr_len; 123 signal(SIGPIPE,fun); 124 fd = socket(AF_INET,SOCK_STREAM,0); 125 if(fd<0) 126 { 127 perror("socket"); 128 return -1; 129 } 130 saddr.sin_family = AF_INET; 131 saddr.sin_port = htons(9000); 132 inet_pton(AF_INET,"192.168.6.128",&saddr.sin_addr.s_addr); 133 ret = bind(fd,(struct sockaddr*)&saddr,sizeof(saddr)); 134 if(ret<0) 135 { 136 perror("bind"); 137 goto END; 138 } 139 ret = listen(fd,20); 140 if(ret<0) 141 { 142 perror("listen"); 143 goto END; 144 } 145 addr_len = sizeof(caddr); 146 while(1)//循環接收多個客戶端 147 { 148 printf("accept..\n"); 149 nfd = accept(fd,(struct sockaddr*)&caddr,&addr_len); 150 if(nfd<0) 151 { 152 perror("accept"); 153 } 154 printf("accept over..\n"); 155 ret=pthread_create(&pthid,NULL,thread,(void*)nfd); 156 } 157 close(nfd);pthread_join(pthid,NULL); 158 END: 159 close(fd); 160 return 0; 161 }

代碼2:客戶端(主要是創建連接、發送數據)

  1 #include"common.h"
  2 
  3 typedef struct stu
  4 {
  5     int id;
  6     char name[20];
  7     int score;
  8     struct stu *next;
  9 }Stu,*PStu;
 10 
 11 void create_list(PStu *phead)
 12 {
 13     *phead=NULL;
 14     PStu ptr,r;
 15     int id,score;
 16     char name[20];
 17     printf("當id為0時結束添加\n");
 18     printf("id=");
 19     scanf("%d",&id);getchar();
 20     while(id>0)
 21     {
 22         printf("name=");
 23         scanf("%s",name);getchar();
 24         printf("score=");
 25         scanf("%d",&score);getchar();
 26         ptr=malloc(sizeof(Stu));
 27         ptr->id=id;
 28         ptr->score=score;
 29         strcpy(ptr->name,name);
 30         ptr->next=NULL;
 31         if(*phead==NULL)
 32         {
 33             *phead=ptr;
 34         }
 35         else
 36         {
 37             r->next=ptr;
 38         }
 39         r=ptr;
 40 
 41         printf("當id為0時結束添加\n");
 42         printf("id=");
 43         scanf("%d",&id);getchar();
 44     }
 45 
 46     return ;
 47 
 48 }
 49 
 50 void show(PStu head)
 51 {
 52     while(head!=NULL)
 53     {
 54         printf("%d\t%s\t%d\n",head->id,head->name,head->score);
 55         head=head->next;
 56     }
 57     return;
 58 }
 59 
 60 void fun()
 61 {
 62     printf("鏈接中斷\n");
 63     return;
 64 }
 65 
 66 int main()
 67 {
 68 //  show(head);
 69     int fd;
 70     int ret;
 71     struct sockaddr_in saddr;
 72     signal(SIGPIPE,fun);
 73     fd=socket(AF_INET,SOCK_STREAM,0);
 74     if(fd<0)
 75     {
 76         perror("socket");
 77         return -1;
 78     }
 79     saddr.sin_family=AF_INET;
 80     saddr.sin_port=htons(9000);
 81 
 82     inet_pton(AF_INET,"192.168.6.128",&saddr.sin_addr.s_addr);
 83 
 84     ret = connect(fd,(struct sockaddr*)&saddr,sizeof(saddr));
 85     if(ret<0)
 86     {
 87         perror("connect");
 88         goto END;
 89     }
 90     PStu head=NULL;
 91     create_list(&head);
 92     PStu p=head;
 93     for(;p!=NULL;p=p->next)
 94     {
 95         ret = write(fd,p,sizeof(Stu));
 96     //  printf("123");
 97 
 98         if(ret<0)
 99         {
100             printf("ret=%d\n",ret);
101             perror("write");
102         }
103     }
104 
105 END:
106     close(fd);
107     return 0;
108 }

網絡編程2.0