- 论坛徽章:
- 0
|
本帖最后由 guaguaguaguaxi 于 2010-06-19 11:06 编辑
首先我想实现的是兼容IPV4,IPV6的网络程序,所以我的socket都是用getaddrinfo创建的.
我遇到的问题是:
我在TCP服务器端的accept之后(即客户端连接之后)用getnameinfo函数可以获得客户端的IP以及PORT,然后用这个IP和端口来用sendto发送消息到客户端.
一般的UDP编程都是客户端先发送,然后服务器端再接收,接收到之后recvfrom后面两个参数已经有了客户端的IP和端口消息,服务器端利用recvfrom的消息再来sendto发送消息到客户端.
而我要是实现的是利用getnameinfo函数获得的IP和端口消息(两个字符串类型),我的部分代码如下所示:
TCP服务器端: (UDP的服务器端也在同个程序中),TCP和UDP用的端口不一样- newfd=accept(s[i],(struct sockaddr *)&from, &fromlen);
- if(newfd<0) continue;
- ret=getnameinfo((struct sockaddr *)&from, fromlen, hostddr,sizeof(hostddr), cliddr,sizeof( cliddr), NI_NUMERICHOST | NI_NUMERICSERV);
- printf("trying %s port %s\n",hostddr,cliddr); // 可以得到客户端的IP和端口消息
-
- udp_addr(hostddr,cliddr,&peer_addr,&peer_addr_len); // 通过udp_addr函数把IP和端口消息写入peer_addr
- len=sendto(udpfd, buffer, strlen(buffer), 0,peer_addr,peer_addr_len);// 发送简单字符串,例如"xigua"
- printf("sendto len=%d\n",len);//长度打印为5
复制代码 其中udp_addr函数为:- void udp_addr(const char *host, const char *serv, struct sockaddr **saptr, socklen_t *lenp)
- {
- int sockfd, n;
- struct addrinfo hints, *res, *ressave;
- bzero(&hints, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)
- printf("udp_client error for %s, %s: %s",host, serv, gai_strerror(n));
- *saptr =(struct sockaddr *) malloc (res->ai_addrlen);
- memcpy((void*)*saptr, res->ai_addr, res->ai_addrlen);
- *lenp = res->ai_addrlen;
-
- }
复制代码 TCP客户端: (UDP的客户端也在同个程序中)- int udp_client(const char *host, const char *serv)
- {
- int sockfd, n,error;
- struct addrinfo hints, *res, *ressave;
- char hbuf[NI_MAXHOST],sbuf[NI_MAXSERV];
- bzero(&hints, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)
- printf("udp_client error for %s, %s: %s",host, serv, gai_strerror(n));
- ressave = res;
- do {
- sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
- if (sockfd >= 0)
- break;
- } while ( (res = res->ai_next) != NULL);
- if (res == NULL)
- printf("udp_client error for %s, %s", host, serv);
- freeaddrinfo(ressave);
- return(sockfd);
- }
- int main(int argc, char *argv[])
- {
- int sockfd,udpfd, len;
- char buf[1024] ;
- struct sockaddr_storage from;
- socklen_t fromlen;
- if (argc == 4) {
- sockfd =tcp_connect (argv[1], argv[2]); //TCP客户端,IP和UDP的一样,端口与TCP服务器端的一样
- udpfd= udp_client (argv[1], argv[3]); //UDP客户端,端口与UDP服务器端的一样
- }
-
- while(1)
- {
- memset(buf,0,sizeof(buf));
- fromlen= sizeof(struct sockaddr_storage);
- len=recvfrom (udpfd, buf,sizeof(buf),0,(struct sockaddr *)&from, &fromlen);
- if(len <= 0){
- perror("recv");
- continue;
- }
- buf[len]=0;
- fprintf(stdout,"server > %s\n",buf);
- }
- return 0;
- }
复制代码 如上面的程序,服务器sendto函数之后打印发送长度len为5,好象是发送出去了,但是客户端这边却什么也没收到,recvfrom阻塞在那里.
大家帮我看看怎么解决,不甚感激!!!!!!!!
我突然想到,accept之后用getnameinfo函数获得的客户端的IP以及PORT是TCP客户端的,不是UDP客户端的,那又应该怎么办呢?急需大家的帮助,谢谢. |
|