UNIX网络编程学习(18)--UDP回射(服务器+客户端)程序
2012-05-10 21:31
363 查看
服务器端:
客户端:
知道客户端临时端口号的任何进程都可以往客户发送数据报,这些数据报会与正常的服务器应答混杂。解决方法是修改recvfrom调用以返回数据报发送者的IP地址和端口号,保留来自数据报所发往服务器的应答,而忽略任何其他数据报。
#include "unp.h" int main(int argc, char **argv) { int sockfd; struct sockaddr_in cliaddr, servaddr; sockfd = Socket(AF_INET, SOCK_DGRAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); Bind(sockfd, (SA *) &servaddr, sizeof(servaddr)); dg_echo(sockfd,(SA* ) &cliaddr, sizeof(cliaddr)); }
#include "unp.h" void dg_echo(int sockfd ,SA *pcliaddr,socklen_t clilen) { int n; socklen_t len; char mesg[MAXLINE]; for( ; ;) { len = clilen; n = Recvfrom(sockfd, mesg, MAXLINE ,0 ,pcliaddr,&len); Sendto(sockfd,mesg,n, 0, pcliaddr ,len); } }
客户端:
#include "unp.h" #define DEST_IP "127.0.0.1" int main(int argc, char ** argv) { int sockfd; struct sockaddr_in servaddr; sockfd = Socket(AF_INET, SOCK_DGRAM, 0); bzero(&servaddr, sizeof(struct sockaddr_in)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); Inet_pton(AF_INET, DEST_IP, &servaddr.sin_addr); dg_cli(stdin, sockfd, (SA *) &servaddr ,sizeof(servaddr)); exit(0); }
#include "unp.h" void dg_cli(FILE *fp, int sockfd, const SA* pservaddr, socklen_t servlen) { int n; char sendline[MAXLINE], recvline[MAXLINE+1]; while(Fgets(sendline, MAXLINE, fp) != NULL) { Sendto(sockfd, sendline, strlen(sendline), 0 , pservaddr, servlen); n = Recvfrom(sockfd ,recvline, MAXLINE, 0, NULL, NULL); recvline = 0; Fputs(recvline, stdout); } }
知道客户端临时端口号的任何进程都可以往客户发送数据报,这些数据报会与正常的服务器应答混杂。解决方法是修改recvfrom调用以返回数据报发送者的IP地址和端口号,保留来自数据报所发往服务器的应答,而忽略任何其他数据报。
#include "unp.h" void dg_cli(FILE *fp, int sockfd, const SA* pservaddr, socklen_t servlen) { int n; char sendline[MAXLINE], recvline[MAXLINE+1]; socklen_t len; struct sockaddr *preply_addr; preply_addr = Malloc(servlen); while(Fgets(sendline, MAXLINE, fp) != NULL) { Sendto(sockfd, sendline, strlen(sendline), 0 , pservaddr, servlen); len = servlen; n = Recvfrom(sockfd ,recvline, MAXLINE, 0, preply_addr, &len); if(len != servlen || memcmp(pservaddr, preply_addr, len) != 0) { printf("reply from %s (ignored)\n", Sock_ntop(preply_addr, len)); continue; } recvline = 0; Fputs(recvline, stdout); } free(preply_addr); }
相关文章推荐
- 《unix网络编程》(18)基本UDP套接字 简单客户服务器回射程序及改进
- Java_socket程序学习03-一个客户端对一个服务器-交互(服务器端)--01
- 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。
- qt5学习之网络通讯(qt5 udp 客户端和服务端程序)
- 基于UDP协议的服务器/客户端程序
- 一个简单的UDP程序—C++服务器和C# .NET客户端
- Java_socket程序学习03-一个客户端对一个服务器-交互(客户端)--02
- 简单的网络通信程序,客户端发送hello,server 服务器反馈 ok UDP
- 基于UDP协议的服务器/客户端程序
- UDP服务器和客户端程序实例
- Java_socket程序学习04-一个服务器对多个一个客户端
- 学习Unix 1 时间/日期服务器和客户端程序
- Java学习笔记(一)------服务器&客户端一对一通信小程序实现(TCP)
- UNIX网络编程——TCP回射服务器/客户端程序
- Java_socket程序学习01-一个客户端对一个服务器
- 【Java学习笔记】60:客户端PC-后端程序服务器-数据库服务器之间的通信demo
- 本程序说明了如何建立一个可以接收UDP客户端数据的UDP 服务器
- UNIX网络编程——TCP回射服务器/客户端程序
- 【UNP学习笔记】一个简单的服务器/客户端程序
- 《UNIX网络编程》UDP客户端服务器:消息回显