UDP套接字

UDP:是无连接不可靠的数据报协议,一些常见的程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议).

UDP和TCP在首部中都有覆盖它们首部和数据的检验和.UDP的检验和是可选的,而TCP的检验和是必需的.如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃.不产生任何差错报文.其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动

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块,比代码大全还贵一块),还有哪本圣经比它更贵的告诉我下...谢谢!
[img]http://dl.iteye.com/upload/attachment/0064/4278/c70daab5-bf6a-3d10-843f-c5a580fc71d1.png[/img]


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);
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值