读书人

C语言UDP程序不同接口收发信息有关问

发布时间: 2012-03-27 13:44:24 作者: rapoo

C语言UDP程序,不同接口收发信息问题
我做一个C语言的UDP程序,客户端先给服务器端60000端口发信息,然后服务器端接收到后给我客户端60001的端口发信息,客户端再接受显示出来。请帮忙看看我程序有什么问题?
客户端的
testClient.c
——————————————————————————————————————
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(void)
{
int sockfd , sockfd2;
int tolen ,tolen2 , fromlen;
struct sockaddr_in to_address , to_address2, from_address;
int result ;
int ch[3] ;

sockfd = socket(AF_INET,SOCK_DGRAM,0);
sockfd2 = socket(AF_INET,SOCK_DGRAM,0);

to_address.sin_family = AF_INET ;
//to_address.sin_addr.s_addr = INADDR_ANY ;
to_address.sin_addr.s_addr = inet_addr("192.168.0.50");
to_address.sin_port = htons(60000) ;
tolen = sizeof(to_address);

bind(sockfd , (struct sockaddr *)&to_address , tolen);

from_address.sin_family = AF_INET ;
//to_address.sin_addr.s_addr = INADDR_ANY ;
from_address.sin_addr.s_addr = inet_addr("192.168.0.50");
from_address.sin_port = htons(60001) ;
tolen2 = sizeof(from_address);

bind(sockfd2 , (struct sockaddr *)&from_address , tolen2);

printf("A = ");
scanf("%d",&ch[0]);

printf("B = ");
scanf("%d",&ch[1]);

sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address , tolen);

recvfrom(sockfd2 , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &tolen2);

printf("A + B = %d \n",ch[2]);

close(sockfd);
close(sockfd2);
return 0;
}
——————————————————————————————————————————————
服务器端的:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(void)
{
int ch[3] ;
int sockfd, sockfd2;
int tolen , tolen2, fromlen ;
struct sockaddr_in to_address, to_address2;
struct sockaddr_in from_address ;

sockfd = socket(AF_INET,SOCK_DGRAM,0);
to_address.sin_family = AF_INET ;
to_address.sin_addr.s_addr = INADDR_ANY;
to_address.sin_port = htons(60000) ;

tolen = sizeof(to_address);
bind(sockfd , (struct sockaddr *)&to_address , tolen);

sockfd2 = socket(AF_INET,SOCK_DGRAM,0);
to_address2.sin_family = AF_INET ;
to_address2.sin_addr.s_addr = inet_addr("192.168.0.36");
to_address2.sin_port = htons(60001) ;

tolen2 = sizeof(to_address2);
bind(sockfd2 , (struct sockaddr *)&to_address2 , tolen2);

while(1) {
printf("server waiting\n");

recvfrom(sockfd , ch , sizeof(ch) , 0 ,
(struct sockaddr *)&from_address , &fromlen);

ch[2] = ch[0] + ch[1] ;
printf("A + B = %d \n",ch[2]);

sendto(sockfd2 , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address2 , tolen2);
}
return 0;
}
现在服务器端能接受到数据,但客户端不能接收到服务器端回送的数据

[解决办法]

C/C++ code
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main(void){  int sockfd;  int tolen ,tolen2 , fromlen;  struct sockaddr_in to_address , local_address, from_address;  int result ;  int ch[3] ;  sockfd = socket(AF_INET,SOCK_DGRAM,0);  local_address.sin_family = AF_INET ;  local_address.sin_addr.s_addr = INADDR_ANY ;  local_address.sin_port = htons(60001) ;  tolen = sizeof(local_address);  to_address.sin_family = AF_INET ;  to_address.sin_addr.s_addr = inet_addr("192.168.0.50");  to_address.sin_port = htons(60000) ;  tolen = sizeof(to_address);  bind(sockfd , (struct sockaddr *)&local_address , tolen);  printf("A = ");  scanf("%d",&ch[0]);  printf("B = ");  scanf("%d",&ch[1]);  sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address , tolen);  recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &tolen2);  printf("A + B = %d \n",ch[2]);    close(sockfd);  return 0;}——————————————————————————————————————————————服务器端的:#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main(void){  int ch[3] ;  int sockfd;  int tolen , tolen2, fromlen ;  struct sockaddr_in to_address, local_address;  struct sockaddr_in from_address ;  sockfd = socket(AF_INET,SOCK_DGRAM,0);  local_address.sin_family = AF_INET ;  local_address.sin_addr.s_addr = INADDR_ANY;  local_address.sin_port = htons(60000) ;  tolen = sizeof(local_address);  bind(sockfd , (struct sockaddr *)&to_address , tolen);     to_address.sin_family = AF_INET ;  to_address.sin_addr.s_addr = inet_addr("192.168.0.36");  to_address.sin_port = htons(60001);  tolen = sizeof(to_address);  while(1) {  printf("server waiting\n");  recvfrom(sockfd , ch , sizeof(ch) , 0 ,    (struct sockaddr *)&from_address , &fromlen);  ch[2] = ch[0] + ch[1] ;printf("A + B = %d \n",ch[2]);    sendto(sockfd2 , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address , tolen2);  }  return 0;} 


[解决办法]
http://liuzhigong.blog.163.com/blog/static/178272375201172021328123/
给个链接给你看吧、
不过一般是开一个线程去接收数据、如果不想阻塞了 在外部关闭接收的套接字就行了。recv、recvfrom返回失败 、结束该线程

读书人网 >C语言

热点推荐