- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <stdlib.h>
- #include <arpa/inet.h>
- #include <strings.h>
- void disp_addrcont(struct sockaddr_in *addr)
- {
- printf("std:%d,sin_family:%d\r\n",AF_INET,addr->sin_family);
- if (addr->sin_family!=AF_INET)
- {
- perror("Not an Internet socket\r\n");
- return ;
- }
- printf("address is:%s:%d\r\n",inet_ntoa(addr->sin_addr),htons(addr->sin_port));
- fflush(stdout);
- }
- int main(int argc, char *argv[])
- {
- int listenfd,connfd;
- struct sockaddr_in servaddr,clientaddr,addr;
- int clientaddrLen,addrLen;
- if ((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
- {
- perror("socket error.\r\n");
- exit(1);
- }
- bzero(&servaddr,sizeof(struct sockaddr_in));
- servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
- servaddr.sin_family=AF_INET;
- servaddr.sin_port=htons(8080);
- //设置端口号重用
- int on;
- on = 1;
- int ret = setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
- if (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(struct sockaddr_in))<0)
- {
- perror("bind error,port 8080.\r\n");
- exit(1);
- }
- if (listen(listenfd,1)<0)
- {
- perror("listen error.\r\n");
- exit(1);
- }
- for (;;)
- {
- connfd=accept(listenfd,(struct sockaddr*)&clientaddr,(socklen_t *)&clientaddrLen);
- if (connfd<0)
- {
- perror("accept error.\r\n");
- exit(1);
- }
- printf("accept returned client address:\r\n");
- disp_addrcont(&clientaddr);
- getpeername(connfd,(struct sockaddr*)&addr,(socklen_t *)&addrLen);
- printf("getpeername returned client address:\r\n");
- disp_addrcont(&addr);
- getsockname(connfd,(struct sockaddr*)&addr,(socklen_t *)&addrLen);
- printf("getsockname returned server address:\r\n");
- disp_addrcont(&addr);
- }
- return 0;
- }
网络编程,测试getsockaddr和getpeeraddr函数,代码如上,有两个
问题:
1、第一次用telnet测试程序,得到的地址不是 AF_INET类型的,不关闭程序,继续telnet得到的地址确实AF_INET类型的了,不解
2、于是我调试,调试时发现不能查看addr,clientaddr,servaddr中的成员变量,
显示为:<unavailable synchroneous data>。在网上也
没有找到合适的解决方案,于是拿过来问问,希望高手赐教。