免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3880 | 回复: 5
打印 上一主题 下一主题

[C] 一个简单的UDP点对点通信程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-04 16:39 |只看该作者 |倒序浏览
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <time.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <netdb.h>
#include <sys/select.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MAXLEN 1024
#define NPORT  2000
int main(int argc, char *argv[])
{
    int sockfd;
    fd_set rset;
    struct sockaddr_in friend_addr,local_addr;
    char send_buf[MAXLEN];
    char recv_buf[MAXLEN];
    int n,len;
    if(argc != 2)
    {
         printf("Usage:%s IPadress\n");
     return 1;
    }
   
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);  

    bzero(send_buf, sizeof(send_buf));
    bzero(recv_buf, sizeof(recv_buf));
    bzero(&friend_addr, sizeof(friend_addr));
    friend_addr.sin_family = AF_INET;
    friend_addr.sin_port = htons (NPORT);
    inet_pton(AF_INET, argv[1], &friend_addr.sin_addr);
     bzero(&local_addr,sizeof(local_addr));
     local_addr.sin_family = AF_INET;
     local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     local_addr.sin_port = htons(NPORT);
     bind(sockfd, (struct sockaddr *) &local_addr, sizeof(local_addr));
     len = sizeof(friend_addr);
     FD_ZERO(&rset);
     for(;;)
     {
         FD_SET(sockfd, &rset);
         FD_SET(0, &rset);
         select(sockfd + 1, &rset, NULL, NULL, NULL);
        if(FD_ISSET(0, &rset))
        {
           printf("Tell %s:", argv[1]);
           fgets(send_buf, MAXLEN, stdin);
           sendto(sockfd,send_buf, MAXLEN, 0, (struct sockaddr *) &friend_addr, sizeof(friend_addr));
         }
        if(FD_ISSET(sockfd, &rset))
        {   n = recvfrom(sockfd,recv_buf,MAXLEN,0,NULL, NULL);
            recv_buf[n] = 0;
            printf("recved from %s: %s\n", argv[1], recv_buf);   
        }
     }      
}




[ 本帖最后由 weiqiboy 于 2008-12-4 16:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-04 16:44 |只看该作者
这段代码通过UDP协议进行简单的点对点通信,用法:udptalk 对方IP地址,现在有个问题 ,在获取标准输入的 时候 ,
即这段代码:
if(FD_ISSET(0, &rset))
        {
           printf("Tell %s:", argv[1]);
           fgets(send_buf, MAXLEN, stdin);
           sendto(sockfd,send_buf, MAXLEN, 0, (struct sockaddr *) &friend_addr, sizeof(friend_addr));
         }

在开始的时候不能打印出提示Tell %s,直接就 获取输入了 ,之后可以打印提示 。

[ 本帖最后由 weiqiboy 于 2008-12-4 16:52 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-12-04 17:37 |只看该作者
拜托哪位大虾指点一下,不胜感激。

论坛徽章:
0
4 [报告]
发表于 2008-12-04 18:24 |只看该作者
加上\n

论坛徽章:
0
5 [报告]
发表于 2008-12-04 22:53 |只看该作者
3个printf就那个没有\n

论坛徽章:
0
6 [报告]
发表于 2008-12-07 10:45 |只看该作者

回复 #1 weiqiboy 的帖子

建议研究一下stdio的缓存机制, 全缓存, 行缓存, 不缓存 三种.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP