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/ (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |