赞
踩
void print_usage(char *progname) { printf("%s usage: \n", progname); printf("-p(--port): sepcify server port.\n"); printf("-h(--Help): print this help information.\n"); return ; } { int port = 0; int ch; struct option opts[] = { {"port", required_argument, NULL, 'p'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; while( (ch=getopt_long(argc, argv, "p:h", opts, NULL)) != -1 ) { switch(ch) { case 'p': port=atoi(optarg);//字符串 ----> 整形 break; case 'h': print_usage(argv[0]); return 0; } } if(!port) //未正常使用命令 { print_usage(argv[0]); return 0; } }
{
socket_fd = socket(AF_INET, SOCK_STREAM, 0);//IPV4 TCP
if(socket_fd < 0)
{
printf("Create socket failure : %s\n", strerror(errno));
return -1;
}
printf("Create socket [%d] successful!\n", socket_fd);
setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));//防止程序端口重用报错
}
{ memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(port); // 主机字节序 ----> 网络字节序 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有的 IP 主机-----> 网络 rv = bind(socket_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if(rv < 0) { printf("Socket[%d] bind on port [%d] failure : %s\n",socket_fd,port,strerror(errno)); return -2; } printf("Socket[%d] bind on port [%d] successful!\n", socket_fd, port); //listen listen(socket_fd, 13); }
//accept
clifd = accept(socket_fd, (struct sockaddr *)&cliaddr, &len);
if(clifd < 0)
{
printf("Accept new client failure:%s\n", strerror(errno));
continue;
}
printf("Accept new client [%s:%d] successfully!\n"
,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));//客户端的IP和端口
{ memset(buf, 0, sizeof(buf)); rv = read(clifd, buf, sizeof(buf)); if(rv < 0) { printf("Read from client by clifd[%d] failure: %s\n", clifd , strerror(errno)); close(clifd); continue; } else if(rv == 0) { printf("Clifd[%d] get disconnected\n", clifd); close(clifd); continue; } else if(rv > 0) { printf("Read [%d] byte data from client clifd[%d] : %s\n", rv, clifd, buf); } }
{
rv = write(clifd, MSG_STR, strlen(MSG_STR));
if(rv < 0)
{
printf("write to client by clifd[%d] failure: %s\n", clifd , strerror(errno));
close(clifd);
continue;
}
printf("Close client fd[%d]\n", clifd);
close(clifd);
}
{ int ch; struct option opts[] = { {"ipaddr", required_argument, NULL, 'i'}, {"port", required_argument, NULL, 'p'}, {"domain_name", required_argument, NULL, 'd'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; while( (ch=getopt_long(argc, argv, "i:p:d:h", opts, NULL)) != -1 ) { switch(ch) { case 'i': servip=optarg; break; case 'p': port=atoi(optarg); break; case 'd': ser_domain_name=optarg; break; case 'h': print_usage(argv[0]); return 0; } } if( !servip || !port || !ser_domain_name) { print_usage(argv[0]); return 0; } //打印域名和解析后的IP地址 p = gethostbyname(ser_domain_name); printf("domain_name : %s servip : %s\n", ser_domain_name, inet_ntoa(*((struct in_addr *)p->h_addr))); }
{
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd < 0)
{
printf("Create socket failure :%s\n", strerror(errno));
return -1;
}
printf("Create socket [%d] successful!\n", socket_fd);
}
{
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);// 主----> 网
inet_aton(servip, &servaddr.sin_addr); //字符串 -----> 网络字节序
rv = connect(socket_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(rv < 0)
{
printf("Connect to server [%s:%d] failure : %s\n", servip, port, strerror(errno));
return -2;
}
printf("Connect to server [%s:%d] successful!\n", servip, port);
}
{ rv = write(socket_fd, MSG_STR, strlen(MSG_STR)); if(rv < 0) { printf("Write to server by socket_fd [%d] failure : %s\n", socket_fd, strerror(errno)); break; } //read memset(buf, 0, sizeof(buf)); rv = read(socket_fd, buf, sizeof(buf)); if(rv < 0) { printf("Read from server by sockfd[%d] failure: %s\n", socket_fd , strerror(errno)); break; } else if(0 == rv) { printf("Socketfd[%d] get disconnected\n", socket_fd); break; } else if(rv > 0) { printf("Read [%d] byte from server socket_fd [%d] : %s\n", rv, socket_fd, buf); } close(socket_fd); }
{ pid = fork(); if(pid < 0) { printf("fork() create child process failure : %s\n", strerror(errno)); close(cli_fd); } else if(pid > 0) // 父进程 的功能函数 { close(cli_fd); //父进程 不需要 客户端描述符 continue; } else if(0 == pid) { close(socket_fd); //子进程不需要 该fd,该fd用于监听,监听到了后,使用新的fd ....//服务器与客户端通讯部分 } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。