#include#include #include #include #include #include #define PORT 1180 #define MAXFD_SIZE 50 int fd[MAXFD_SIZE]; int main(int argc, char *argv[]) { int listenfd, clientfd; struct sockaddr_in addr; int maxfd = 0; int fd; int i; int ret; int rc; fd_set fdsr, tmpset; struct timeval tv; static char recv_msg[BUFSIZ]; static char send_msg[BUFSIZ]; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket create failuren"); exit(1); } bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(PORT); if (bind(listenfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { printf("socket bind failuren"); exit(1); } if (listen(listenfd, 5) < 0) { printf("socket listen failuren"); exit(1); } printf("listen fd(%d)n", listenfd); FD_ZERO(&fdsr); maxfd = listenfd; FD_SET(listenfd,&fdsr); while (1) { tmpset = fdsr; tv.tv_sec = 10; tv.tv_usec =0; ret = select(maxfd + 1, &tmpset, NULL, NULL, &tv); if (ret < 0) { printf("select failuren"); exit(1); } else if (ret == 0) { //printf("select timeoutn"); continue; } for (fd = 0; fd <= maxfd; fd++) { if (FD_ISSET(fd, &tmpset)) { if (fd == listenfd) { struct sockaddr_in client; socklen_t clilen = sizeof(client); if((clientfd = accept(listenfd,(struct sockaddr *)&client, &clilen)) < 0) { if(errno == EINTR) { continue; } else { perror("accept"); exit(1); } } printf("new client fd(%d)n", clientfd); FD_SET(clientfd, &fdsr); if (clientfd > maxfd) { maxfd = clientfd; } } else { memset(recv_msg, 0x00, BUFSIZ); rc = recv(fd, recv_msg, BUFSIZ, 0); if (rc <= 0) { printf("close client fd(%d)n", fd); close(fd); FD_CLR(fd, &fdsr); if (fd == maxfd) { for (i = maxfd; i > 0; i--) { if (FD_ISSET(i, &fdsr)) { maxfd = i; break; } } printf("maxfd = %dn", maxfd); } continue; } strcpy(send_msg, recv_msg); send(fd, send_msg, strlen(send_msg), 0); } } } } return 0; }
配一个客户端程序
#include#include #include #include #include #include #include #include #include #define PORT 1180 #define HOST "192.168.20.169" #define MSG_MAX 1024 #define KEEPALIVE_INTERVAL 60 #define CMD_KEEPALIVE "command=keepalive;" int timer = 0; char cmd[50] = {0}; void* key_monitor(void* param) { printf("key_monitor startn"); pthread_detach(pthread_self()); while (1) { if (strlen(cmd) == 0) { scanf("%s", cmd); printf("get(%s)n", cmd); } sleep(1); } printf("key_monitor endn"); return NULL; } int main(int argc, char *argv[]) { int fd; int len; struct sockaddr_in address; int result; char send_msg[MSG_MAX] = {0}; char recv_msg[MSG_MAX] = {0}; int ret = 0; static pthread_t thread_id = 0; if (argc != 2) { perror("usage:tcpcli "); exit(1); } result = pthread_create(&thread_id, NULL, (void *)key_monitor, NULL); if (result != 0) { printf("thread create failuren"); return 0; } if ((fd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) { printf("socket create failuren"); return 0; } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(argv[1]); address.sin_port = htons(PORT); result = connect(fd, (struct sockaddr *)&address, sizeof(address)); if (result == -1) { close(fd); perror("oops: client"); exit(1); } while (1) { if (timer >= KEEPALIVE_INTERVAL) { timer = 0; strcpy(send_msg, CMD_KEEPALIVE); result = send(fd, send_msg, strlen(send_msg), 0); if (result < 0) { printf("socket send errorn"); close(fd); return -1; } memset(recv_msg, 0x00, sizeof(recv_msg)); result = recv(fd, recv_msg, MSG_MAX, 0); if (result < 0) { printf("socket recv errorn"); close(fd); return -1; } printf("recv from server(%s)n", recv_msg); } if (strlen(cmd) > 0) { if (strcmp(cmd, "q") == 0) { break; } strcpy(send_msg, cmd); result = send(fd, send_msg, strlen(send_msg), 0); if (result < 0) { printf("socket send errorn"); close(fd); return -1; } memset(recv_msg, 0x00, sizeof(recv_msg)); result = recv(fd, recv_msg, MSG_MAX, 0); if (result < 0) { printf("socket recv errorn"); close(fd); return -1; } printf("recv from server(%s)n", recv_msg); memset(cmd, 0x00, sizeof(cmd)); } timer++; sleep(1); } close(fd); return 0; }
再配个Makefile
CC = -gcc EXE = client server all : $(EXE) client:client.c $(CC) -o client client.c -lpthread -Wall server:server.c $(CC) -o server server.c -Wall clean: rm server client



