免费注册 查看新帖 |

Chinaunix

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

getsockname的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-30 14:46 |只看该作者 |倒序浏览
10可用积分
不大明白getsockname的用法,我改了一下unix网络编程书里的一个例子,连接时间服务器的客户端例子:
#include        "unp.h"

int
main(int argc, char **argv)
{
        int                                     sockfd, n;
        char                            recvline[MAXLINE + 1];
        struct sockaddr_in      servaddr;
        struct sockaddr_in      cliaddr;
        char buff[MAXLINE];
        socklen_t       len;

        if (argc != 2)
                err_quit("usage: a.out ");

        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                err_sys("socket error");

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port   = htons(1313);      /* daytime server */
        if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
                err_quit("inet_pton error for %s", argv[1]);

        if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
                err_sys("connect error");

        getsockname(sockfd,
(SA*)
&cliaddr,
&len);

printf("%d\n", len);

printf("local address is %s, port is %d\n",
                Inet_ntop(AF_INET,
&cliaddr.sin_addr, buff,
sizeof(buff)),

ntohs(cliaddr.sin_port));

        while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {/*disapear one message from the serv
er*/

                recvline[n] = 0;        /* null terminate */
                if (fputs(recvline, stdout) == EOF)
                        err_sys("fputs error");
        }
        if (n < 0)
                err_sys("read error");

        exit(0);
}

例子中,我想知道内核为sockfd连接分配的端口号,可是输出结果是local address is 0.0.0.0, port is 0
不知道怎么回事?我是新手学网络编程,哪位大侠给解释一下

最佳答案

查看完整内容

在调用getsockname()之前先将len赋值.即len = sizeof(struct sockaddr_in)试试看.

论坛徽章:
0
2 [报告]
发表于 2007-10-30 14:46 |只看该作者
在调用getsockname()之前先将len赋值.

len = sizeof(struct sockaddr_in)
试试看.

论坛徽章:
0
3 [报告]
发表于 2007-10-30 14:52 |只看该作者
你检查下,是否真的连接上了。

论坛徽章:
0
4 [报告]
发表于 2007-10-30 15:04 |只看该作者
可以连接上,我在本机起了个时间服务端
./daytimetcpcli 127.0.0.1
输出结果如下:
16
local address is 0.0.0.0, port is 0
Tue Oct 30 14:56:34 2007

论坛徽章:
0
5 [报告]
发表于 2007-10-30 16:18 |只看该作者
有没有知道啊~ 给个答案,自己顶下~

论坛徽章:
0
6 [报告]
发表于 2007-10-30 16:41 |只看该作者

  1. #include   <stdio.h>   
  2. #include   <string.h>   
  3. #include   <errno.h>   
  4. #include   <sys/types.h>   
  5. #include   <sys/socket.h>   
  6. #include   <netinet/in.h>   
  7. #include   <arpa/inet.h>   
  8.    
  9. int main( void ) {
  10.     int sock;
  11.     struct sockaddr_in sin, cli;   
  12.     int size;

  13.     sock = socket( AF_INET, SOCK_STREAM, 0 );
  14.     if( sock == -1 ) {
  15.         perror( "client socket error" );
  16.         return( -1 );
  17.     }

  18.     memset( &sin, 0, sizeof( sin ) );
  19.     sin.sin_family = AF_INET;
  20.     sin.sin_addr.s_addr = inet_addr( "64.233.189.104" );    // [url]www.google.com[/url]
  21.     sin.sin_port = htons( 80 );

  22.     if( connect( sock, (struct sockaddr *)&sin, sizeof( sin ) ) == -1 ) {   
  23.         perror( "client connect error" );
  24.         return( -1 );
  25.     }

  26.     memset( &cli, 0, sizeof( cli ) );
  27.     size = sizeof( cli );

  28.     if( getsockname( sock, (struct sockaddr *)&cli, &size ) == -1 ) {
  29.         perror( "client sockname" );
  30.         close( sock );
  31.         return( -1 );
  32.     }
  33.    
  34.     if( cli.sin_family == AF_INET ) {
  35.         printf( "local address is: %s, port is: %d\n", inet_ntoa( cli.sin_addr ), ntohs( cli.sin_port ) );   
  36.     } else {
  37.         perror( "unknown cli.sin_family" );
  38.     }

  39.     close( sock );
  40.    
  41.     return( 0 );
  42. }

复制代码


  1. [ test]$ ./5
  2. local address is: xxx.xxx.xxx.xxx, port is: 44168
  3. [ test]$
复制代码

论坛徽章:
0
7 [报告]
发表于 2007-10-30 17:16 |只看该作者
原帖由 scutan 于 2007-10-30 14:46 发表
在调用getsockname()之前先将len赋值.

len = sizeof(struct sockaddr_in)
试试看.

果然是这样子的~~

论坛徽章:
0
8 [报告]
发表于 2007-10-30 17:29 |只看该作者

回复 #6 xB1ue 的帖子

也谢谢xB1ue!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP