UDP:是无连接不可靠的数据报协议,一些常见的程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议).
udp中也有connect:但一般只有在使用自己的套接字与确定的唯一对端进行通信时,才可以调用connect.调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户端长时间通信,这时,客户和服务器都可能调用connect
udp套接字不存在真正的发送缓冲区,内核只是复制应用进程数据并把它沿协议栈向下传送,渐次冠以UDP首部和IP首部.
udpserver.cpp
#include"unp.h"
#include<iostream>
using namespace std;
void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];
bzero(mesg,MAXLINE);
for(;;){
len = clilen;
n = recvfrom(sockfd,mesg,MAXLINE,0,pcliaddr,&len);
cout << mesg << endl;
sendto(sockfd,mesg,n,0,pcliaddr,len);
}
}
int main(int argc,char ** argv)
{
int sockfd;
struct sockaddr_in servaddr,cliaddr;
bzero(&servaddr,sizeof(servaddr));
bzero(&cliaddr,sizeof(cliaddr));
sockfd = socket(AF_INET,SOCK_DGRAM,0);
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));
}
udpclient
#include"unp.h"
#include<stdio.h>
int main(int argc,char ** argv)
{
int sockfd;
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET,"192.168.5.178",&servaddr.sin_addr);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
dg_cli(stdin,sockfd,(SA*)&servaddr,sizeof(servaddr));
exit(0);
}
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[n] = 0;
fputs(recvline,stdout);
}
}
编译client:
1.g++ -c udpclient.cpp
2.g++ -o udpclient udpclient.o
效果图:左下角是在跑的服务器,右边是在命令行跑的客户端,如果你找不到unp.h头文件,那么它出自unix网络编程(129块,比代码大全还贵一块),还有哪本圣经比它更贵的告诉我下...谢谢!
select版
#include"unp.h"
#include"sys/types.h"
int main()
{
int listenfd,connfd,udpfd,nready,maxfdp1;
char mesg[MAXLINE];
pid_t childpid;
fd_set rset;
ssize_t n;
socklen_t len;
const int on = 1;
struct sockaddr_in cliaddr,servaddr;
void sig_chld(int);
listenfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
bind(listenfd,(SA *)&servaddr,sizeof(servaddr));
listen(listenfd,LISTENQ);
udpfd = 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(udpfd,(SA *)&servaddr,sizeof(servaddr));
//signal(SIGCHLD,sig_chld);
FD_ZERO(&rset);
maxfdp1 = max(listenfd,udpfd)+1;
for(;;){
FD_SET(listenfd,&rset);
FD_SET(udpfd,&rset);
if((nready = select(maxfdp1,&rset,NULL,NULL,NULL))<0){
if(errno == EINTR)
continue;
else
perror("select error");
}
if(FD_ISSET(listenfd,&rset)){
len = sizeof(cliaddr);
connfd = accept(listenfd,(SA *)&cliaddr,&len);
if((childpid = fork())==0){
close(listenfd);
//str_echo(connfd);
exit(0);
}
close(connfd);
}
if(FD_ISSET(udpfd,&rset)){
len = sizeof(cliaddr);
n = recvfrom(udpfd,mesg,MAXLINE,0,(SA *)&cliaddr,&len);
sendto(udpfd,mesg,n,0,(SA *)&cliaddr,len);
}
}
}