`

linux socket 多线程

阅读更多
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
void *rec_data(void *fd);
void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, portno;
     int * newsockfd;
     socklen_t clilen;
     struct sockaddr_in serv_addr, cli_addr;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
	 printf("wait for client connect\n");
     while(1) {
    	 pthread_t thread;
    	 newsockfd = (int *)malloc(sizeof(int));
    	 * newsockfd = accept(sockfd,
    	                 (struct sockaddr *) &cli_addr,
    	                 &clilen);
		 if (newsockfd < 0)
			  error("ERROR on accept");
		 if(pthread_create(&thread, NULL, rec_data, newsockfd)!=0) {
			 perror("ERROR on create thread");
			 break;
		 }
     }
     close(sockfd);
     return 0; 
}

void *rec_data(void *fd)
{
       int n, newsockfd;
       char buffer[256];
       newsockfd=*((int*)fd);
       while(1) {
			bzero(buffer,256);
			n = read(newsockfd,buffer,255);
			if (n < 0) error("ERROR reading from socket");
			if(strcmp(buffer,"quit\r\n") == 0) {
			break;
			}
			printf("Here is the message: %s\n",buffer);
			n = write(newsockfd,"I got your message\n",18);
			if (n < 0) error("ERROR writing to socket");
      	}
       free(fd);
       close(newsockfd);
       pthread_exit(NULL);
}


makefile:
all: server
server:server.o
	gcc -g -o server server.o -lpthread
server.o:server.c
	gcc -g -c server.c
clean:
	rm -rf *.o server
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics