Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2112763
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2015-06-19 17:31:46

1. 利用现成的echo服务端与自己写的client端进行udp通信
2. 代码
  1. cong@msi:/work/test/tcpip/14udp/client$ cat client.c
  2. #include "utils.h"

  3. //#define TIME_SERV_ADDR "192.168.4.98"
  4. #define TIME_SERV_ADDR "127.0.0.1"

  5. char * sock_ntop(const struct sockaddr *sa, socklen_t salen)
  6. {
  7.     char portstr[8];
  8.     static char str[128]; /* Unix domain is largest */
  9.     struct sockaddr_in *sin = (struct sockaddr_in *) sa;
  10.     //只处理AF_INET 协议族
  11.     if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)
  12.         return(NULL);
  13.     if (ntohs(sin->sin_port) != 0) {
  14.         snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));
  15.         strcat(str, portstr);
  16.     }
  17.     return(str);
  18. }

  19. void dg_cli(FILE* fp, int sockfd, const struct sockaddr* pservaddr, socklen_t servlen)
  20. {
  21.     int n;
  22.     char sendline[MAXLINE], recvline[MAXLINE];
  23.     socklen_t len;
  24.     struct sockaddr* preply_addr;
  25.     preply_addr = malloc(servlen);
  26.     while(fgets(sendline, MAXLINE, fp) != NULL)
  27.     {
  28.         //write(sockfd, sendline, strlen(sendline));
  29.         sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

  30.         len = servlen;
  31.         n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
  32.         if( (len!=servlen) || (memcmp(pservaddr, preply_addr, len)!= 0))
  33.         {
  34.             dbmsg("reply from %s (ignored)",sock_ntop(preply_addr,len));
  35.             continue;
  36.         }
  37.         recvline[n] = 0;
  38.         fputs(recvline, stdout);
  39.     }
  40. }

  41. int main ( int argc, char *argv[] )
  42. {
  43.     int sockfd, n;
  44.     struct sockaddr_in servaddr;
  45.     char recvline[1024];
  46.     //sockfd = socket(AF_INET, SOCK_STREAM, 0);
  47.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  48.     if(sockfd < 0)
  49.         return -1;
  50.     bzero(&servaddr, sizeof(servaddr));
  51.     servaddr.sin_family = AF_INET;
  52.     servaddr.sin_port = htons(7);
  53.     inet_pton(AF_INET, TIME_SERV_ADDR, &servaddr.sin_addr);

  54.     //connect(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr));
  55.     dbmsg("next dg_cli");
  56.     dg_cli(stdin, sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr));
  57.     return EXIT_SUCCESS;
  58. }
3.错误分析
client端没有收到回复的原因是本机的echo服务没有打开
本机配置一下:
  1. cong@msi:/tmp$ sudo apt-get install xinetd
  2. cong@msi:/tmp$ sudo vi /etc/inetd.conf
  3.    echo dgram udp wait root internal       -->配置echo服务是udp
  4.    #echo stream tcp nowait root internal   -->配置echo服务是tcp
  5. cong@msi:/tmp$ sudo /etc/init.d/xinetd restart
  6. cong@msi:/tmp$ netstat -nlp                -->查看端口
  7.    tcp 0 0 0.0.0.0:7 0.0.0.0:* LISTEN -       -->配置echo服务是tcp就会出现这一行
  8.    udp 0 0 0.0.0.0:7 0.0.0.0:* -              -->配置echo服务是udp,就会出现这一行 
netstat -nlp查看时出现
udp 0 0 0.0.0.0:7 0.0.0.0:* -   -->出现这一行就是我们需要的
client.rar (下载后改名为client.tar.gz)

阅读(1371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~