UNIX网络编程:UDP 的connect函数(改进版)
发布时间:2016-01-16 14:03:24 所属栏目: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/ (编辑:应用网_镇江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
