server: #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/wait.h> #include<pthread.h> #include<iostream> #include<string> using namespace std; #define SERVPORT 10000 /*服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */ void *thread(void *data) { pthread_detach(pthread_self()); //int *client_fd = (int*)data; //int niuniu = *client_fd; int niuniu = (int)data; string receive = ""; int recvbytes; char buf[1024]; recvbytes = recv(niuniu ,buf ,sizeof(buf) ,0); buf[recvbytes] = '/0' ; receive = receive + buf; close(niuniu); if(receive != "") { cout<<receive<<endl; } pthread_exit(NULL); } int main(void) { int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */ struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind出错!"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen出错!"); exit(1); } while(1) { socklen_t sin_size ; sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) { perror("accept出错"); continue; } printf("received a connection from %s/n", inet_ntoa(remote_addr.sin_addr)); pthread_t id; pthread_attr_t id_attr; pthread_attr_init(&id_attr); pthread_attr_setdetachstate(&id_attr,PTHREAD_CREATE_DETACHED); cout<<"id: " <<id <<endl; int aa = client_fd; //if (pthread_create(&id , &id_attr , thread, (void*)&client_fd) < 0 ) //ok if (pthread_create(&id , &id_attr , thread, (void*)aa) < 0 ) //ok { cout<<"pthread_create error" <<endl; } } } client: #include<stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include<string> #include<iostream> using namespace std; #define SERVPORT 10000 #define MAXDATASIZE 100 /*每次最大数据传输量 */ main(int argc, char *argv[]){ int sockfd, recvbytes; char buf[MAXDATASIZE]; struct hostent *host; struct sockaddr_in serv_addr; if (argc < 2) { fprintf(stderr,"Please enter the server's hostname!/n"); exit(1); } if((host=gethostbyname(argv[1]))==NULL) { herror("gethostbyname出错!"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("socket创建出错!"); exit(1); } serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero),8); if (connect(sockfd, (struct sockaddr *)&serv_addr, / sizeof(struct sockaddr)) == -1) { perror("connect出错!"); exit(1); } if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) { perror("recv出错!"); exit(1); } buf[recvbytes] = '/0'; printf("Received: %s",buf); close(sockfd); }