UNIX环境高级编程学习之第十六章网络IPC:套接字 - 简单TCP Socket 通信 /* User:Lixiujie * Date:20101122 * Desc:简单TCP通信,服务器端, 向客户端发送uptime信息。 * File:tcp_server.c * System:Ubuntu 64bit * gcc tcp_server.c tcp_server * tcp_server 7878 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> /* socket bind listen connect accept send recv */ #include <arpa/inet.h> /* htons ntohs htonl ntohl inet_addr inet_ntoa */ #include <netinet/in.h> /* sockaddr_in */ #define BUFLEN 128 #define QLEN 10 /* create tcp server */ int initserver(int type, const struct sockaddr *addr, socklen_t alen, int qlen){ int fd; int err = 0; /* 创建 */ if ((fd = socket(addr->sa_family, type, 0)) < 0){ return -1; } /* 绑定 */ if (bind(fd, addr, alen) < 0){ err = errno; goto errout; } /* 监听数 */ if (SOCK_STREAM == type || SOCK_SEQPACKET == type){ if (listen(fd, qlen) < 0) { err = errno; goto errout; } } return fd; errout: close(fd); errno = err; return -1; } int main(int argc, char *argv[]){ if (argc != 2){ printf("arg err!/n"); return -1; } int sefd, clfd, ret; FILE *fp; char szBuf[BUFLEN]; struct sockaddr_in se_addr,cl_addr; socklen_t alen = sizeof(struct sockaddr); /* 设置服务IP和端口 */ memset((void *)&se_addr, 0, alen); se_addr.sin_family = AF_INET; se_addr.sin_addr.s_addr = INADDR_ANY;// inet_addr("0.0.0.0"); se_addr.sin_port = htons(atoi(argv[1])); if ((sefd = initserver(SOCK_STREAM, (struct sockaddr *)&se_addr, alen, QLEN)) > 0){ while (1){ alen = sizeof(struct sockaddr); memset((void *)&cl_addr, 0 , alen); clfd = accept(sefd, (struct sockaddr*)&cl_addr, &alen); if (clfd < 0){ printf("accept err!/n"); close(sefd); return -1; } printf("Client connect:ip=%s, port=%d /n", inet_ntoa(cl_addr.sin_addr), ntohs(cl_addr.sin_port)); if ((fp = popen("/usr/bin/uptime", "r")) == NULL){ memset(szBuf, 0, BUFLEN); sprintf(szBuf, "error: %s/n", strerror(errno)); send(clfd, szBuf, strlen(szBuf), 0); }else{ memset(szBuf, 0, BUFLEN); while (fgets(szBuf, BUFLEN, fp) != NULL){ send(clfd, szBuf, strlen(szBuf), 0); memset(szBuf, 0, BUFLEN); } pclose(fp); } close(clfd); } }; return 0; } /* User:Lixiujie * Date:20101122 * Desc:简单TCP通信,客户端。 * File:tcp_server.c * System:Ubuntu 64bit * gcc tcp_client.c tcp_client * tcp_client 127.0.0.1 7878 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> /* socket bind listen connect accept send recv */ #include <arpa/inet.h> /* htons ntohs htonl ntohl inet_addr inet_ntoa */ #include <netinet/in.h> /* sockaddr_in */ #define BUFLEN 128 int main(int argc, char *argv[]){ if (argc != 3){ printf("arg err!/n"); return -1; } int sefd, ret; char szBuf[BUFLEN]; struct sockaddr_in se_addr; socklen_t alen = sizeof(struct sockaddr); /* 设置服务端的IP和端口 */ memset((void *)&se_addr, 0, alen); se_addr.sin_family = AF_INET; se_addr.sin_addr.s_addr = inet_addr(argv[1]); se_addr.sin_port = htons(atoi(argv[2])); if ((sefd = socket(se_addr.sin_family, SOCK_STREAM, 0)) < 0){ printf("socket err:%s/n", strerror(errno)); return -1; } if (connect(sefd, (struct sockaddr *)&se_addr, alen) < 0){ printf("connect err:%s/n", strerror(errno)); return -1; } while (1){ memset(szBuf, 0, BUFLEN); ret = recv(sefd, szBuf, BUFLEN, 0); if (ret < 0){ printf("recv err:%s/n", strerror(errno)); return -1; } else if (0 == ret){ printf("recv server close!/n"); return 0; } else { printf("recv data:%s/n", szBuf); } } return 0; }