基于UDP协议的网络编程
2012-05-16 15:41
447 查看
下图是典型的UDP客户端/服务器通讯过程[下图出自《Unix网络编程》]
以下是简单的UDP服务器和客户端程序,服务端接收来自客户端的字符,转成大写后返送给客户端。
备注:程序在ubuntu10.04经过编译验证,可直接使用。
服务端程序:
客户端程序:
以下是简单的UDP服务器和客户端程序,服务端接收来自客户端的字符,转成大写后返送给客户端。
备注:程序在ubuntu10.04经过编译验证,可直接使用。
服务端程序:
/* server.c */ #include <stdio.h> #include <string.h> #include <netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <sys/socket.h> #include <ctype.h> #include <error.h> #define MAXLINE 80 #define SERV_PORT 8000 void perr_exit(const char *s) { perror(s); exit(1); } int main(void) { struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sockfd; int sin_size, read_bytes, send_bytes; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int i, n; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perr_exit("create socket error"); } bzero(&server_addr, sizeof(struct sockaddr_in)); bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(SERV_PORT); if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) { perr_exit("bind error"); } printf("Accepting connections ...\n"); sin_size = sizeof(struct sockaddr); while (1) { memset(buf, '\0', MAXLINE); read_bytes = recvfrom(sockfd, buf, MAXLINE, 0, (struct sockaddr *)&client_addr, &sin_size); if (n == -1) { perr_exit("recvfrom error"); } printf("received from %s at PORT %d\n", (char *)inet_ntop(AF_INET, &client_addr.sin_addr, str, sizeof(str)), (int)ntohs(client_addr.sin_port)); for (i = 0; i < read_bytes; i++) { buf[i] = toupper(buf[i]); } send_bytes = sendto(sockfd, buf, read_bytes, 0, (struct sockaddr *)&client_addr, sin_size); if (send_bytes == -1) { perr_exit("sendto error"); } } }
客户端程序:
/* client.c */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <netinet/in.h> #include <sys/socket.h> #include <errno.h> #define MAXLINE 80 #define SERV_PORT 8000 void perr_exit(const char *s) { perror(s); exit(1); } int main(int argc, char *argv[]) { struct sockaddr_in server_addr; int sockfd, n; int sin_size, read_bytes, send_bytes; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; socklen_t servaddr_len; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perr_exit("create sockte error"); } bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); server_addr.sin_port = htons(SERV_PORT); while (fgets(buf, MAXLINE, stdin) != NULL) { send_bytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (send_bytes == -1) { perr_exit("sendto error"); } read_bytes = recvfrom(sockfd, buf, MAXLINE, 0, NULL, 0); if (n == -1) { perr_exit("recvfrom error"); } printf("recvfrom:%s\n", buf); } close(sockfd); return 0; }
相关文章推荐
- 网络编程应用:基于UDP协议【实现文件下载】--练习
- JAVA基础知识之网络编程——-基于UDP协议的通信例子
- 【转载】 基于UDP、TCP协议的C#网络编程
- 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 [帧设计]
- linux网络编程之socket(十四):基于UDP协议的网络程序
- linux网络编程之socket(十四):基于UDP协议的网络程序
- 网络编程中应用层(基于TCP/UDP)的协议设计
- 【转载】 基于UDP、TCP协议的C#网络编程
- 网络编程应用:基于UDP协议【实现聊天程序】--练习
- 基于UDP协议的网络编程
- 基于UDP、TCP协议的C#网络编程
- 基于UDP协议的网络编程:
- Java网络编程_基于UDP协议的网络编程
- {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习
- java 中基于udp协议的网络编程的 net库包的相关类的用法
- 谈谈网络编程中应用层(基于TCP/UDP)的协议设计
- 网络编程(6)—— 基于Windws系统的UDP协议socket服务器和客户端
- [转贴]基于UDP、TCP协议的C#网络编程之一
- 基于UDP、TCP协议的C#网络编程之一
- linux网络编程之socket(十四):基于UDP协议的网络程序