• udp 通信中的端口问题


    最近写了个天气预报的小程序,基于c/s模式,client向server发送请求,server定时向所有client发送天气更新,两者之间采用无连接的udp通信。以前几乎没有碰过socket网络编程,我也是边学边做的,下面是我在此过程中遇到的一些问题,希望给刚开始接触网络编程的朋友一些借鉴作用,少走弯路。

    主要用到两个函数

    recvfrom,原型如下:

    函数原型:int recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen);

    sendto,原型如下:

    int SendTo(SOCKET s; char * buf, int len, int socketFlags,struct sockaddr  *to ; int tolen);

    错误做法:

    server端新建一个socket并且bind到一个固定端口,循环调用recvfrom函数来监听客户端的请求,当接受到某个client的第一个请求后,记下from参数中的的ip和端口信息(记为x),并发送相应的信息给client。

    定时更新时利用x中存储的客户端地址和端口信息发送更新

    这种做法,client是收不到server发送的定时更新信息的,因为端口不对。

    错误原因:

    对于client,socket没有bind到某个端口,sendto在每次发送信息时候,那么,每次系统会随机分派一个可用端口给其发送,发送后如果调用recvfrom函数,则recvfrom是从该端口接收server发送的返回消息,但是下次就不能在该端口recvfrom到消息了,即端口是一次性的,所以server发送更新的时候,client是接收不到的。

    正确做法:

    client在第一次连接到server的时候,需在相应的数据包中携带自己的监听端口信息,并且监听使用的socket需要bind到该端口上面。server在第一次收到client的消息时是记下数据包的端口而不是from参数中的端口。这样server每次发送更新时向这个端口发送消息,client就能收到了。

  • 相关阅读:
    在 Java 应用程序中绑定 Bean 和数据
    JAVA的23种设计模式
    Windows 2012 Server评估版本安装问题处理
    从程序员到CTO的Java技术路线图
    MyBatis 学习
    CRT【p3868】[TJOI2009]猜数字
    线段树+扫描线【bzoj1645】[USACO07OPEN]城市的地平线City Horizon
    数学【CF743C】Vladik and fractions
    贪心【CF1029E】Tree with Small Distances
    线段树+二进制位拆分【CF242E】XOR on Segment
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3022114.html
Copyright © 2020-2023  润新知