网络编程2.0

代码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 }

猜你喜欢

转载自www.cnblogs.com/it8343/p/9264927.html