Linux UDP消息发送与接收的问题

Z_Beginner 2012-09-19 10:31:15
Client端发送UDP报文,
Server端接收处理后,用来源地址(IP和端口与客户端发送的相同)直接发送信息回Client代码如下:
m_SrcAddrInfo从Server端的recvfrom函数里来,通过打印和抓包工具看出IP和端口是发送的IP和端口。
int m_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sendto(m_Socket, buffer, bufferSize, 0,
(struct sockaddr*)&m_SrcAddrInfo, sizeof(m_SrcAddrInfo));

Client端在发送完成后等待该端口数据回应代码如下:
m_SocketID = openSocket();
timeout.tv_sec = 1;
timeout.tv_usec = INT_ZERO;

if(sendto(m_SocketID, buf, size, 0,
(struct sockaddr*)&m_ToAddr, sizeof(m_ToAddr)) != size)
{
closeSocket();
return -1;
}

active = select(m_SocketID + 1, &read_fd, NULL, NULL, &timeout);
但结果总是超时(active==0)。不能这样使用吗?还是哪里处理的不正确,请指教,谢谢了!
...全文
625 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独小剑 2012-09-30
  • 打赏
  • 举报
回复
static int init_sockfd(void)
{
struct sockaddr_in thisaddr;
if((sockfd=socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
NMN_DEBUG(log_lv_error, "init sockfd failed ...\n");
return -1;
}

thisaddr.sin_family = AF_INET;
thisaddr.sin_addr.s_addr = htonl(INADDR_ANY); //#define INADDR_ANY ((unsigned long int) 0x00000000)
thisaddr.sin_port = htons(0);
if(bind(sockfd, (struct sockaddr *)&thisaddr, sizeof(thisaddr)) == -1) {
NMN_DEBUG(log_lv_error, "bind failed ...\n");
return -1;
}
return 0;
}

Z_Beginner 2012-09-21
  • 打赏
  • 举报
回复
我希望client用发送端口接收server端的回应(server端也是回复到client的发送端口的),发送端口是随机的,如何绑定?我没有绑定端口,我用发送socket接收回复。
我抓包发现个奇怪的问题,每次server端成功发送回复报文后,client端又发送了一次ICMP到server,并且显示该ICMP报文失败(因为主机不可达)。

[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
我是这么做的,fp是啥文件描述符啊,怎么申明和定义的?能否详细描述下。我这样做,本机的进程间可以回复,但不同机器间不能回复,还是超时,抓包后,显示server端有回应,地址和端口也是发送的IP和端口。
int socketID = connect();

timeout.tv_sec = INT_ONE;
timeout.tv_usec = INT_ZERO;……
[/Quote]
孤独小剑 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
我是这么做的,fp是啥文件描述符啊,怎么申明和定义的?能否详细描述下。我这样做,本机的进程间可以回复,但不同机器间不能回复,还是超时,抓包后,显示server端有回应,地址和端口也是发送的IP和端口。
int socketID = connect();

timeout.tv_sec = INT_ONE;
timeout.tv_usec = INT_ZERO;
FD_ZERO(&……
[/Quote]fp文件描述符声明FILE 定义去系统头文件里找吧。
第二个收不到回复的问题,既然抓到包了就说明给了回复,收不到有几个原因:客户端没有同样bind端口,再者就是因为客户端防火墙。
孤独小剑 2012-09-20
  • 打赏
  • 举报
回复
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
  FD_SET(sock,&fds); //添加描述符
  FD_SET(fp,&fds); //同上
  maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1
  select(maxfdp,&fds,&fds,NULL,&timeout);
Z_Beginner 2012-09-20
  • 打赏
  • 举报
回复
我是这么做的,fp是啥文件描述符啊,怎么申明和定义的?能否详细描述下。我这样做,本机的进程间可以回复,但不同机器间不能回复,还是超时,抓包后,显示server端有回应,地址和端口也是发送的IP和端口。
int socketID = connect();

timeout.tv_sec = INT_ONE;
timeout.tv_usec = INT_ZERO;
FD_ZERO(&read_fd);
FD_SET(socketID, &read_fd);

if(!sendBuf(socketID, buf, size))
{
disconnect(socketID);
return result;
}

active = select(socketID + 1, &read_fd, NULL, NULL, &timeout);

[Quote=引用 3 楼 的回复:]

C/C++ code
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
  FD_SET(sock,&fds); //添加描述符
  FD_SET(fp,&fds); //同上
  maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1
  select(maxfdp,&fds,&fds,NULL,&a……
[/Quote]
Geoff08Zhang 2012-09-19
  • 打赏
  • 举报
回复
你要调用 FD_SET(m_SocketID, read_fd);
建议参考《WinSock网络编程经络》第14章, 19章 这里有源码,解压后找Daytime.
源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358
  • 打赏
  • 举报
回复
m_SocketID + 1 ?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧