为什么使用getsockname函数得到的结构体为0,无法取得ip和端口

时间:2022-10-16 11:04:15
用gdb跟进去发现在getsockname以前一切正常,而执行完getsockname函数后就发现ss结构体成员为0,代码如下:
  
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

#define MAXLINE 1024
int main()
{
        int     sockfd, n;
        char    recvline[MAXLINE + 1];
        struct  sockaddr_in     servaddr;

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

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port   = htons(8000);      /* daytime server */
        if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0)
                printf("inet_pton error for ");

        if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
                printf("connect error");

        struct sockaddr_in ss;
        int len = sizeof(ss);
        if (getsockname(sockfd, (struct sockaddr *)&ss, &len) < 0)
                return -1;
        static char str[128];
        inet_ntop(AF_INET, ss.sin_addr, str, sizeof(str));

        char portstr[8];
        if (ntohs(ss.sin_port) != 0)
                snprintf(portstr, sizeof(portstr),":%d", ntohs(ss.sin_port)  );

        while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
                recvline[n] = 0;        /* null terminate */
                if (fputs(recvline, stdout) == EOF)
                        printf("fputs error");
        }
        if (n < 0)
                printf("read error");

        exit(0);
}
~

5 个解决方案

#1


getsockname没有什么问题,
倒是32行有问题
inet_ntop(AF_INET, ss.sin_addr, str, sizeof(str));
应该改为
inet_ntop(AF_INET, &ss.sin_addr, str, sizeof(str));

#2


引用 1 楼 mymtom 的回复:
getsockname没有什么问题,
倒是32行有问题
inet_ntop(AF_INET, ss.sin_addr, str, sizeof(str));
应该改为
inet_ntop(AF_INET, &amp;ss.sin_addr, str, sizeof(str));

不好意思这里误写了,我用gdb看的时候29行的getsockname函数只将端口号存放在ss结构中,而ip为0, 为什么使用getsockname函数得到的结构体为0,无法取得ip和端口

#3


LZ在仔细找找错误吧,我测试着是可以的,可以看到 ip

#4


引用 3 楼 woaishuo2011 的回复:
LZ在仔细找找错误吧,我测试着是可以的,可以看到 ip

你改动我的代码了吗?这个问题太诡异了,难道是我系统的原因

#5


你的代码我只改了端口号,连到我以前写服务器,ip是有值的

#1


getsockname没有什么问题,
倒是32行有问题
inet_ntop(AF_INET, ss.sin_addr, str, sizeof(str));
应该改为
inet_ntop(AF_INET, &ss.sin_addr, str, sizeof(str));

#2


引用 1 楼 mymtom 的回复:
getsockname没有什么问题,
倒是32行有问题
inet_ntop(AF_INET, ss.sin_addr, str, sizeof(str));
应该改为
inet_ntop(AF_INET, &amp;ss.sin_addr, str, sizeof(str));

不好意思这里误写了,我用gdb看的时候29行的getsockname函数只将端口号存放在ss结构中,而ip为0, 为什么使用getsockname函数得到的结构体为0,无法取得ip和端口

#3


LZ在仔细找找错误吧,我测试着是可以的,可以看到 ip

#4


引用 3 楼 woaishuo2011 的回复:
LZ在仔细找找错误吧,我测试着是可以的,可以看到 ip

你改动我的代码了吗?这个问题太诡异了,难道是我系统的原因

#5


你的代码我只改了端口号,连到我以前写服务器,ip是有值的