加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX网络编程:UDP 的connect函数(改进版)

发布时间:2016-01-12 09:08:07 所属栏目:Unix 来源:网络整理
导读:上一篇我们提到,除非套接字已连接,否则异步错误是不会返回到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接大相径庭:没有

2.性能

在一个未连接的UDP套接字上给两个数据报调用sendto函数于是涉及内核执行下列6个步骤:

(1)连接套接字;

(2)输出第一个数据报;

(3)断开套接字连接;

(4)连接套接字;

(5)输出第二个数据报;

(6)断开套接字连接。

调用connect后调用两次write涉及内核执行3个步骤:

(1)连接套接字;

(2)输出第一个数据报;

(3)输出第二个数据报。

客户端程序:

#include <unistd.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <errno.h>  
#include <string.h>  
      
#define SERV_PORT 3333  
#define MAXLINE 1024  
#define ERR_EXIT(m) 
        do  
        {   
                perror(m);   
                exit(EXIT_FAILURE);   
        } while(0)  
      
typedef struct sockaddr SA;  
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)  
{  
    int     n;    
    char    sendline[MAXLINE], recvline[MAXLINE + 1];  
/////////////////////////////////////////////////////////////////////////  
    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.2.103", &servaddr.sin_addr);      
/////////////////////////////////////////////////////////////////////////////    
    connect(sockfd, (SA *) pservaddr, servlen);    
        
    while (fgets(sendline, MAXLINE, fp) != NULL) {    
        
        n = write(sockfd, sendline, strlen(sendline));   
        //n = sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);  
        //n = sendto(sockfd, sendline, strlen(sendline), 0, &servaddr, sizeof(servaddr));         
        //n = sendto(sockfd, sendline, strlen(sendline), 0, NULL, 0);  
        if (n == -1)    
        {    
            if (errno == EISCONN)    
                ERR_EXIT("sendto");    
            else
                perror("sendto huangcheng");              
        }         
              
              
        //struct sockaddr_in preply_addr;  
        //socklen_t addrlen;  
        n = read(sockfd, recvline, MAXLINE);  
        //n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);  
        //n = recvfrom(sockfd, recvline, MAXLINE, 0, (SA*)&preply_addr, &addrlen);        
        if (n == -1)    
        {    
            if (errno == EINTR)    
                continue;    
            ERR_EXIT("recvfrom");    
        }   
        //printf("reply from %s n",inet_ntoa(preply_addr.sin_addr));  
        recvline[n] = 0;    /* null terminate */
        fputs(recvline, stdout);  
    }  
}  
      
int main(int argc, char **argv)  
{  
    int                 sockfd;  
    struct sockaddr_in  servaddr;  
      
    if (argc != 2)  
        ERR_EXIT("usage: udpcli <IPaddress>");  
      
    bzero(&servaddr, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_port = htons(SERV_PORT);  
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);  
      
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
      
    dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));  
      
    exit(0);  
}

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读