Server
/*Socket Server * 2014-12-15 CopyRight (c) Arbboter*/#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<time.h>#include<sys/socket.h>#include<sys/types.h>#include<netdb.h>#include<string.h>#include<arpa/inet.h>#include<pthread.h>#include<vector>using namespaceStd;vector<int>vecclient;//Thread Sync Lockpthread_mutex_t Mutex =Pthread_mutex_initializer; void* RECV_THR (void*p);void* SEND_THR (void*p);intMain () {intSockfd_server; intsockfd_client; structsockaddr_in Addr_server; structsockaddr_in addr_client; socklen_t Addr_len=0; intClient_max =Ten; intServer_port =33891; Srand (Time (NULL)); //Create socketSockfd_server = socket (af_inet, Sock_stream,0); if(Sockfd_server = =-1) {printf ("init socket failed\n"); return-1; } //Set Addressmemset (&addr_server,0,sizeof(Addr_server)); Addr_server.sin_family=af_inet; Addr_server.sin_addr.s_addr=htonl (Inaddr_any); Addr_server.sin_port=htons (Server_port); //socket bind with address if(Bind (Sockfd_server, (structsockaddr*) &addr_server,sizeof(structSOCKADDR)) = =-1) {printf ("bind socket failed\n"); return-1; } //Server socket start list, waitting client to connect//This client_max refers to the number of simultaneous connections if(Listen (sockfd_server, client_max) = =-1) {printf ("Start Listen socket failed\n"); return-1; } //Data Threadpthread_t tid =0; Pthread_create (&tid, NULL, SEND_THR, NULL); while(1) {Addr_len=sizeof(structsockaddr_in); printf ("waitting for connected...\n"); //waitting for ConnectedSockfd_client = Accept (Sockfd_server, (structsockaddr*) &addr_client, &Addr_len); if(Sockfd_client = =-1) {printf ("Accept Socket failed\n"); return-1; } //Create a thread to talk with clientprintf"recived connection from:%s\n", Inet_ntoa (ADDR_CLIENT.SIN_ADDR)); Pthread_create (&tid, NULL, Recv_thr, (void*) &sockfd_client); //add to send data object collectionPthread_mutex_lock (&mutex); Vecclient.push_back (sockfd_client); Pthread_mutex_unlock (&mutex); } close (Sockfd_server); Pthread_mutex_destroy (&mutex); return 0;}//Data Collectionvoid* RECV_THR (void*2) { intFD = * ((int*) (p); intNread =0; Charszbuf[ +] = {0}; while(1) {memset (szbuf,0,sizeof(SZBUF)); Nread= Read (FD, SZBUF,sizeof(SZBUF)); printf ("Client:%s\n", szbuf); if(strcmp (Szbuf,"quit") ==0) { Break; } sprintf (Szbuf,"Your magic number is:%d", rand ()% -); printf ("Server:%s\n", szbuf); Write (FD, szbuf, strlen (szbuf)); } returnNULL;}//Send Datavoid* SEND_THR (void*p) {size_t I=0; Charszbuf[ +] = {0}; while(1) {Sleep (rand ()%Ten); Pthread_mutex_lock (&mutex); for(intI=0; I<vecclient.size (); i++) {sprintf (szbuf,"Your magic number is:%d", rand ()% -); printf ("[%02d] Server:%s\n", I, szbuf); Write (Vecclient[i], szbuf, strlen (szbuf)); } pthread_mutex_unlock (&mutex); } returnNULL;}
Client
/*Socket Client * 2014-12-15 CopyRight (c) Arbboter*/#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<sys/types.h>#include<netdb.h>#include<string.h>#include<arpa/inet.h>#include<pthread.h>#include<signal.h>#include<errno.h>#include<string.h>void* RECV_THR (void*p);intMain () {intSockfd_server; structsockaddr_in Addr_server; socklen_t Addr_len=0; intServer_port =33891; Char* Server_addr ="192.168.2.200"; //Create socketSockfd_server = socket (af_inet, Sock_stream,0); if(Sockfd_server = =-1) {printf ("init socket failed\n"); return-1; } //Set server addressmemset (&addr_server,0,sizeof(Addr_server)); Addr_server.sin_family=af_inet; Addr_server.sin_addr.s_addr=inet_addr (SERVER_ADDR); Addr_server.sin_port=htons (Server_port); //Connect Server if(Connect (Sockfd_server,structSOCKADDR *) &addr_server,sizeof(structSOCKADDR)) ==-1) {printf ("Connect Server failed\n"); return-1; } //start the Collect data threadpthread_t tid =0; Pthread_create (&tid, NULL, Recv_thr, (void*) &sockfd_server); //Send Data Charszbuf[ +] = {0}; intNlen =0; while(1) { //Collection Thread exited if(Esrch = = Pthread_kill (tid,0) ) { Break; } //wait for input datagets (SZBUF); Nlen=strlen (SZBUF); if(Nlen >0) {Szbuf[nlen]=' /'; Write (Sockfd_server, szbuf, Nlen); }} close (Sockfd_server); return 0;}//Data Collectionvoid* RECV_THR (void*p) { intFD = * ((int*) (p); intNread =0; Charszbuf[ +] = {0}; while(1) {memset (szbuf,0,sizeof(SZBUF)); Nread= Read (FD, SZBUF,sizeof(SZBUF)); printf ("Server:%s\n", szbuf); if(strcmp (Szbuf,"quit") ==0) { Break; } } returnNULL;}
Using multithreading to simulate asynchronous network communication under Linux