UNIX环境高级编程——TCP/IP网络编程
发布时间:2016-09-26 03:42:49 所属栏目:Unix 来源:站长网
导读:副标题#e# 常用网络信息检索函数 gethostname() getppername() getsockname() gethostbyname() gethostbyaddr() getprotobyname() getprotobynumber() getservbyname() getservbyport() 网络属性设置 头文件: #include sys/types.h #include sys/socket.h
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <errno.h> #include <strings.h> #include <netinet/in.h> #include <arpa/inet.h> typedef struct sockaddr SA; #define N 64 int main(int argc, char *argv[]) { int sockfd; ssize_t n; struct sockaddr_in servaddr; char buf[N] = {0}; if (argc < 3) { fprintf(stdout, "usage:%s ip portn", argv[0]); exit(0); } if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(-1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = PF_INET; servaddr.sin_port = htons(atoi(argv[2]));// "9000"---9000 servaddr.sin_addr.s_addr = inet_addr(argv[1]); if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) == -1) { perror("connect"); exit(-1); } printf(">"); while (fgets(buf, N, stdin) != NULL)//abcn { buf[strlen(buf)-1] = 0;//abc send(sockfd, buf, N, 0); bzero(buf, sizeof(buf)); n = recv(sockfd, buf, N, 0); printf("n=%d buf=%sn", n, buf); printf(">"); } close(sockfd); exit(0); } 网络超时: 超时检测的必要性: 避免无数据时无限制的阻塞 设定的时间到时,进程从原操作返回继续运行 TCP套接字中的recv/accept/connect UDP套接字中的recvfrom 都会造成阻塞 三种超时检测的方法: 1、设置socket的属性SO_RCVTIMEO #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <errno.h> #include <strings.h> #include <netinet/in.h> #include <arpa/inet.h> typedef struct sockaddr SA; voidf(int sig) {printf("*n");} int main(int argc, char *argv[]) { int listenfd, connfd; struct sockaddr_in myaddr, peeraddr; socklen_t len; if (argc < 3) { fprintf(stdout, "usage:%s ip portn", argv[0]); exit(0); } if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(-1); } bzero(&myaddr, sizeof(myaddr)); myaddr.sin_family = PF_INET; myaddr.sin_port = htons(atoi(argv[2]));//htons(9000) myaddr.sin_addr.s_addr = inet_addr(argv[1]); int on = 1; if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) { perror("setsockopt"); exit(-1); } if (bind (listenfd, (SA *)&myaddr, sizeof(myaddr)) == -1) { perror("bind"); exit(-1); } if (listen(listenfd, 5) == -1) { perror("listen"); exit(-1); } bzero(&peeraddr, sizeof(peeraddr)); len = sizeof(peeraddr); struct timeval t={5, 0}; if (setsockopt(listenfd, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t)) == -1) { perror("setsockopt"); exit(-1); } while (1) { if ((connfd = accept(listenfd, (SA *)&peeraddr, &len)) == -1) { printf("%dn", errno); exit(-1); } printf("welcome %s:%dn", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port)); close(connfd); } exit(0); } (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |