客户端:
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0); \ int main(void) { int sock; char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; if((sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0) { ERR_EXIT("socket"); } /*if(listenfd = socket(PF_INET,SOCK_STREAM,0)<0)*/ struct sockaddr_in servaddr; memset(&servaddr,0,sizeof(servaddr)); //初始化 servaddr.sin_family = AF_INET; //地址族 servaddr.sin_port = htons(5188); //端口号 /*servaddr.sin_addr.s_addr = htonl(INADDR_ANY);*/ servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /*iner_aton("127.0.0.1",&servaddr.sin_addr);*/ if( connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0) { ERR_EXIT("connect"); } else { printf("ip = %s,port = %d\n",inet_ntoa(servaddr.sin_addr),servaddr.sin_port); while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL) { write(sock,sendbuf,strlen(sendbuf)); read(sock,recvbuf,sizeof(recvbuf)); fputs(recvbuf,stdout); memset(sendbuf,0,sizeof(sendbuf)); memset(recvbuf,0,sizeof(recvbuf)); } } close(sock); return 0; }
服务器端:
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <pthread.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0); \ /*通信处理函数*/ void do_service(int conn) { char recvbuf[1024] = {0}; while(1) { memset(recvbuf,0,sizeof(recvbuf)); int ret = read(conn,recvbuf,sizeof(recvbuf)); if(ret == 0) { printf("click close\n"); break; } else if(ret == -1) { ERR_EXIT("read"); } fputs(recvbuf,stdout); write(conn,recvbuf,ret); } } void* thread_routine(void *arg) { pthread_detach(pthread_self()); int conn = *((int*)arg); do_service(conn); printf("pthread exiting...\n"); return 0; } int main(void) { int listenfd; if((listenfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0) { ERR_EXIT("socket"); } struct sockaddr_in servaddr; memset(&servaddr,0,sizeof(servaddr)); //初始化 servaddr.sin_family = AF_INET; //地址族 servaddr.sin_port = htons(5188); //端口号 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /*设置地址重复利用*/ int on = 1; if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0) { ERR_EXIT("setsockopt"); } /*绑定*/ if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0 ) { ERR_EXIT("bind"); } /*绑定监听*/ if(listen(listenfd,SOMAXCONN) < 0) { ERR_EXIT("listen"); } struct sockaddr_in peeraddr; /*目标地址*/ socklen_t peerlen = sizeof(peeraddr); int conn; /*已连接套接字*/ pthread_t tid; int ret; while(1) { /*等待连接*/ if( (conn = accept(listenfd,(struct sockaddr*)&peeraddr,&peerlen)) < 0 ) { ERR_EXIT("accept"); } printf("ip = %s,port = %d\n",inet_ntoa(peeraddr.sin_addr),peeraddr.sin_port); int *p; p = malloc(sizeof(int)); *p = conn; //线程的错误处理 if ((ret = pthread_create(&tid, NULL, thread_routine, p)) != 0) { fprintf(stderr, "pthread_create:%s\n",strerror(ret)); exit(EXIT_FAILURE); } } return 0; }