网络编程学习笔记(tcp_listen函数)
来源:互联网 发布:javascript做网站 编辑:程序博客网 时间:2024/05/16 17:16
执行tcp服务器程序的一般操作步骤:创建一个tcp套接口,给它捆绑服务器众所周知端口,并允许接受外来的连接请求,其代码如下:
#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/socket.h>#include <unistd.h>#include <time.h>#include <stdlib.h>#define LISTENQ 3#define MAXLINE 128int tcp_listen(const char *host, const char *serv, socklen_t *addrlenp){int listenfd, n;const int on = 1;struct addrinfo hints, *res, *ressave;bzero(&hints, sizeof(hints));hints.ai_flags = AI_PASSIVE;hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_STREAM;if ((n = getaddrinfo(host, serv, &hints, &res)) != 0) {printf("tcp_listen error for %s, %s: %s\n", host, serv, gai_strerror(n));return -1;}ressave = res;do {listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);if (listenfd < 0) continue;if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {close(listenfd);printf("setsockopt error:%s\n", strerror(errno));continue;}if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) break;close(listenfd);} while ((res = res->ai_next) != NULL);if (res == NULL) {printf("tcp_listen error for %s, %s\n", host, serv);return -1;}if (listen(listenfd, LISTENQ) < 0) {printf("listen error:%s\n", strerror(errno));close(listenfd);return -1;}if (addrlenp) *addrlenp = res->ai_addrlen;freeaddrinfo(ressave);return listenfd;}char *sock_ntop(struct sockaddr *sa, socklen_t len){char portstr[7];static char str[MAXLINE + 1];switch (sa->sa_family) {case AF_INET:{struct sockaddr_in *sin = (struct sockaddr_in*)sa;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) return NULL;if (ntohs(sin->sin_port) != 0) {snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));strcat(str, portstr);}return str;}}return NULL;}int main(int argc, char **argv){int listenfd, connfd;socklen_t addrlen, len;char buff[MAXLINE + 1];time_t ticks;struct sockaddr *cliaddr;if (argc != 2) {printf("usage: exename <service or port>\n");return -1;}listenfd = tcp_listen(NULL, argv[1], &addrlen);if (listenfd < 0) return -1;cliaddr = malloc(addrlen);for (;;) {len = addrlen;connfd = accept(listenfd, cliaddr, &len);printf("connection from :%s\n", sock_ntop(cliaddr, len));ticks = time(NULL);snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));write(connfd, buff, strlen(buff));close(connfd);}return 0;}
输出为:
0 0
- 网络编程学习笔记(tcp_listen函数)
- 网络编程学习笔记(poll函数)
- 网络编程学习笔记(gethostbyname函数)
- 网络编程学习笔记(gethostbyaddr函数)
- 网络编程学习笔记(uname函数)
- 网络编程学习笔记(gethostname函数)
- 网络编程学习笔记(getaddrinfo函数)
- 网络编程学习笔记(gai_strerror函数)
- 网络编程学习笔记(freeaddrinfo函数)
- 网络编程学习笔记(tcp_connect函数)
- 网络编程学习笔记(udp_client函数)
- 网络编程学习笔记(udp_connect函数)
- 网络编程学习笔记(udp_server函数)
- 网络编程学习笔记(getnameinfo函数)
- 网络编程学习笔记(socketpair函数)
- 网络编程学习笔记(shutdown函数)
- 网络编程学习笔记
- 学习笔记--网络编程
- POJ2403 Hay Points
- 有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
- 基于openwrt的自动OQS配置脚本
- Android 手机上安装并运行 Ubuntu 12.04
- uva 103(DAG,嵌套)
- 网络编程学习笔记(tcp_listen函数)
- Weka算法Clusterers-DBSCAN源码分析
- 斗地主牌型判断实现(二)
- 设计模式六大原则
- 如果在夜暗里没有夜枭的鸣叫
- 别样JAVA学习(六)继承下(2.2)异常上
- std::map查询效率优化
- LDD3中网络驱动源码注释
- Ubuntu下su:authentication failure的解决办法