UNIX环境高级编程学习之第十六章网络IPC:套接字 – 简单TCP Socket 通信

Linux/Unix C/C++ xiujie 168℃ 0评论 已收录

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;
}




喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址