UNIX環境高級編程學習之第十六章網絡IPC:套接字 - 簡單UDP Socket 通信
/* User:Lixiujie * Date:20101122 * Desc:簡單Udp通信,向其它連接過來的發送uptime信息。 * File:udp_client1.c * System:Ubuntu 64bit * gcc udp_client1.c udp_client1 * udp_client1 0.0.0.0 7878 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> /* socket bind listen connect accept send recv sendto recvfrom */ #include <arpa/inet.h> /* htons ntohs htonl ntohl inet_addr inet_ntoa */ #include <netinet/in.h> /* sockaddr_in */ #define BUFLEN 128 /* create udp */ 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 != 3){ printf("arg err!/n"); return -1; } int myfd, ret; FILE *fp; char szBuf[BUFLEN]; struct sockaddr_in my_addr,you_addr; socklen_t alen = sizeof(struct sockaddr); /* 設置本身IP和端口 */ memset((void *)&my_addr, 0, alen); my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = inet_addr(argv[1]); my_addr.sin_port = htons(atoi(argv[2])); if ((myfd = initserver(SOCK_DGRAM, (struct sockaddr *)&my_addr, alen, 0)) > 0){ while (1){ alen = sizeof(struct sockaddr); memset((void *)&you_addr, 0 , alen); memset(szBuf, 0, BUFLEN); ret = recvfrom(myfd, szBuf, BUFLEN, 0, (struct sockaddr*)&you_addr, &alen); if (ret < 0){ printf("recvfrom err=%s!/n", strerror(errno)); close(myfd); return -1; } printf("udp recvfrom:ip=%s, port=%d, data:%s /n", inet_ntoa(you_addr.sin_addr), ntohs(you_addr.sin_port), szBuf); if ((fp = popen("/usr/bin/uptime", "r")) == NULL){ memset(szBuf, 0, BUFLEN); sprintf(szBuf, "error: %s/n", strerror(errno)); sendto(myfd, szBuf, strlen(szBuf), 0, (struct sockaddr*)&you_addr, alen); }else{ memset(szBuf, 0, BUFLEN); while (fgets(szBuf, BUFLEN, fp) != NULL){ sendto(myfd, szBuf, strlen(szBuf), 0, (struct sockaddr*)&you_addr, alen); memset(szBuf, 0, BUFLEN); } pclose(fp); } } }else{ printf("initserver err=%s!/n", strerror(errno)); close(myfd); return -1; } close(myfd); return 0; }
/* User:Lixiujie * Date:20101122 * Desc:簡單Udp通信,向udp_client1發送請求,接收返回的uptime信息。 * File:udp_client2.c * System:Ubuntu 64bit * gcc udp_client2.c udp_client2 * udp_client2 0.0.0.0 8989 127.0.0.1 7878 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> /* socket bind listen connect accept send recv sendto recvfrom */ #include <arpa/inet.h> /* htons ntohs htonl ntohl inet_addr inet_ntoa */ #include <netinet/in.h> /* sockaddr_in */ #define BUFLEN 128 /* create udp */ 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 != 5){ printf("arg err!/n"); return -1; } int myfd, ret; FILE *fp; char szBuf[BUFLEN]; struct sockaddr_in my_addr,you_addr; socklen_t alen = sizeof(struct sockaddr); /* 設置本身IP和端口 */ memset((void *)&my_addr, 0, alen); my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = inet_addr(argv[1]); my_addr.sin_port = htons(atoi(argv[2])); /* 設置對方IP和端口 */ memset((void *)&you_addr, 0, alen); you_addr.sin_family = AF_INET; you_addr.sin_addr.s_addr = inet_addr(argv[3]); you_addr.sin_port = htons(atoi(argv[4])); if ((myfd = initserver(SOCK_DGRAM, (struct sockaddr *)&my_addr, alen, 0)) > 0){ memset(szBuf, 0, BUFLEN); strcpy(szBuf, "request"); ret = sendto(myfd, szBuf, strlen(szBuf), 0, (struct sockaddr*)&you_addr, alen); if (ret < 0){ printf("sendto err=%s!/n", strerror(errno)); close(myfd); return -1; } ret = recvfrom(myfd, szBuf, BUFLEN, 0, (struct sockaddr*)&you_addr, &alen); if (ret < 0){ printf("recvfrom err=%s!/n", strerror(errno)); close(myfd); return -1; } printf("udp recvfrom:ip=%s, port=%d, data:%s /n", inet_ntoa(you_addr.sin_addr), ntohs(you_addr.sin_port), szBuf); }else{ printf("initserver err=%s!/n", strerror(errno)); close(myfd); return -1; } close(myfd); return 0; }
UNIX環境高級編程學習之第十一章線程-線程的創建、退出、等待、取消、分離 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #i
UNIX環境高級編程學習之第五章標準IO-實現查看所有用戶 #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(i
UNIX環境高級編程學習之第六章系統數據文件和信息-修改第四章實現的Shell的“ls -l”功能, 加入顯示文件的用戶名和組名 // 只能查看目錄中的所有文件屬性 #include <stdio.h> #include <stdlib.
UNIX環境高級編程學習之第十章信號-信號集的操作,讓進程阻塞SIGQUIT信號 /* File: sigprocmask.c Desc: 信號集的操作,讓進程阻塞SIGQUIT信號 */ #include <stdio.h> #in
UNIX環境高級編程學習之第八章進程控制-用父子進程實現打開kate,返回kate關閉狀態 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unis
UNIX環境高級編程學習之第三章文件IO-文件讀操作 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include
UNIX環境高級編程學習之第十章信號-信號的基本操作(綁定/忽略/默認/發送) /* File: signal.c Desc: 信號基本操作 */ #include <stdio.h> #include <stdlib.h> #inc
到現在,我Unix,數據庫的掃盲基本完成了,就差網絡這一塊了。從今天開始網絡掃盲。上週五開始看HTTPD的實現,我們的httpd是AA(AA是我們SBE的元老之一)開發的,只要是AA開發的東西,學習一遍都很有收穫。因爲AA是一位非常優秀的