UDP套接字

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块,比代码大全还贵一块),还有哪本圣经比它更贵的告诉我下...谢谢!
UDP套接字_第1张图片


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


你可能感兴趣的:(UDP)