UNIX 网络编程测试代码 -- UDP通信
来源:互联网 发布:怎么评价邓小平知乎 编辑:程序博客网 时间:2024/05/01 02:58
运行环境:centos 6.3
说明 :UNIX 网络编程测试代码
将客户端、服务端、以及广播消息的服务端都集成一段代码里面,个人感觉还不错呵呵呵
里面的注释不多,但是应该不难读懂的,还算比较容易
可以把一面代码直接贴下来,用gcc 编译跑一下,会发现在效果还不错
#include <stdio.h>#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <arpa/inet.h>#include <unistd.h>typedef struct sockaddr_in sockaddr_in;typedef struct sockaddr sockaddr;int main(int argc, char ** argv) {sockaddr_in srv, cli;int fd, sfd, is_server;if (argc < 3) {printf("please put the arguments ,like ./a.out addr_ip addr_port [server/client/broad]");return -1;}if (argc >= 4) {if (strcmp("server", argv[3]) == 0) {is_server = 1;printf("i am server \n");} else if (strcmp("client", argv[3]) == 0) {is_server = 0;printf("i am client \n");} else if(strcmp("broad",argv[3]) == 0){is_server = 2;printf("i want broad msg ,broad ip:X.X.X.255 \n");} else {printf("arguments error\n");return -1;}} else {//defaultis_server = -1 ;printf("i could recv and send msg ,muti process\n");}memset(&srv, 0, sizeof(srv));srv.sin_port = htons(atoi(argv[2]));srv.sin_family = AF_INET;if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("server socket error");}if(is_server != -1){fd = 1-is_server ;}else{fd = fork();if (fd < 0) {perror("fork error");return -1;}}if (0 == fd) { //service is_server == 1char recvbuf[1024];char ip[50];socklen_t len;int rnu = 0;srv.sin_addr.s_addr = INADDR_ANY ;int bfd;if ((bfd = bind(sfd, (sockaddr*) &srv, sizeof(sockaddr))) < 0) {perror("bind error");}while (1) {memset(recvbuf, 0, sizeof(recvbuf));len = sizeof(sockaddr);if((rnu = recvfrom(sfd, recvbuf, sizeof(recvbuf), 0, (sockaddr*) &cli,&len))<0) {printf("recvfrom error");} else {printf("from:%s,recv:%s",inet_ntop(AF_INET, &cli.sin_addr, ip, sizeof(ip)),recvbuf);if (is_server!=-1 && sendto(sfd, recvbuf, strlen(recvbuf), 0, (sockaddr*) &srv, len) < 0) {perror("sendto error");}//printf("send:%s\n",inet_ntop(AF_INET, &srv.sin_addr, ip, sizeof(ip)));sleep(2);}}close(sfd);}else if(-1 == fd){//broadcastchar recvbuf[1024];char ip[50];socklen_t len;int rnu = 0;srv.sin_addr.s_addr = INADDR_ANY ;int bfd;if ((bfd = bind(sfd, (sockaddr*) &srv, sizeof(sockaddr))) < 0) {perror("bind error");}while (1) {memset(recvbuf, 0, sizeof(recvbuf));len = sizeof(sockaddr);int on_broadcast = 1;int rs = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &on_broadcast,sizeof(on_broadcast));if ((rs = inet_pton(AF_INET, "10.33.28.255", &srv.sin_addr)) <= 0) {perror("inet_pton error:");}strcpy(recvbuf, "this is broad\n");if (sendto(sfd, recvbuf, strlen(recvbuf), 0, (sockaddr*) &srv, len)< 0) {perror("sendto error");}printf("send:%s\n",inet_ntop(AF_INET, &srv.sin_addr, ip, sizeof(ip)));sleep(2);}close(sfd);}else {char sendbuf[1024], *p = sendbuf;ssize_t bs;char ip[50];socklen_t len = sizeof(sockaddr);inet_aton(argv[1], &srv.sin_addr);while (1) {memset(sendbuf, 0, sizeof(sendbuf));bs = sizeof(sendbuf);bs = getline(&p, &bs, stdin);bs = sendto(sfd, sendbuf, bs, 0, (sockaddr*) &srv, len);printf("sendto:%s", sendbuf);if(is_server!=-1 && (bs = recvfrom(sfd, sendbuf, sizeof(sendbuf), 0, (sockaddr*) &cli,&len))>0){printf("from:%s,recv:%s",inet_ntop(AF_INET, &cli.sin_addr, ip, sizeof(ip)),sendbuf);}}close(sfd);}}
- UNIX 网络编程测试代码 -- UDP通信
- unix 网络编程--UDP
- unix环境编程 UDP通信
- 网络编程--UDP通信
- 网络编程-udp通信
- unix网络编程之udp
- Unix c 网络编程 UDP
- 《UNIX网络编程》UDP网络编程基础
- 代码篇C#网络编程之UDP进程通信
- C++编程->UDP通信测试
- 网络通信编程demo1[Udp]
- Java网络编程:UDP通信
- Java网络编程:UDP通信
- JAVA网络编程--UDP通信
- Java网络编程:UDP通信
- JAVA 网络编程 UDP通信
- 网络编程2----UDP通信
- 网络编程中的UDP通信
- foj 1607
- 将类型生成到模块中
- 都有谁在做IT教育?
- 英语练习113 Slow down
- 去掉小数后面多余的零
- UNIX 网络编程测试代码 -- UDP通信
- java中覆盖、重写与重载的区别
- LINUX 的OID中英文对照
- Asp.Net函数大全
- vim 中执行shell命令
- 访问量破一万要发帖
- ORACLE中一个字符占多少字节?
- Blog 搬新家了
- 行人检测(Pedestrian Detection)资源