inetntoalinux
我用的就是下面的代码,就是不行,这就是我组合的,不知道哪里出问题了,请高手指点。谢谢!foreverxun.
//server.c
#include<stdlib.h>#include<stdio.h>#include<sys/types.h>#include<netdb.h>#include<errno.h>
#define MYPORT 12000#define BACKLOG 2#define MAXSIZE 4096
int b_link(int port){
int sockfd,ret,len,con_fd; struct sockaddr_in ser_addr;int nsize;
sockfd=socket(AF_INET,SOCK_STREAM,0);//建立一个ip/tcp套接口
if(sockfd<0){ printf("error in building a socket\n\a");return -1;}
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(port);
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&(ser_addr.sin_zero),8);
ret=bind(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr));//端口绑定
if(ret<0) {printf("error in binding port\n\a");return -1;}
ret=listen(sockfd,10);//端口监听.简单起见,只接受一个请求
if(ret<0){printf("error in listening \n\a");return -1;}
return sockfd;}
int b_access(int sockfd,char *buffn)//接受服务请求,接收文件
{
int con_fd;struct sockaddr_in cli_addr;int sin_size;sin_size=sizeof(struct sockaddr_in);
con_fd=accept(sockfd,(struct sockadd*)&cli_addr,&sin_size);//接受请求
if(con_fd<0){printf("error in accepting \n\a");close(sockfd);return -1;}
printf("client %s connect.......\n",inet_ntoa(*(struct sockaddr_in *)&cli_addr.sin_addr.s_addr));
int numbytes;
if((numbytes=recv(con_fd, buffn, 50, 0)) == -1){perror ( " recv " ) ;exit ( 1 ) ;return 0;}
printf("buffn content is %s .......\n",buffn);
char buf[MAXSIZE];FILE *File;int nsize;
File=fopen(buffn,"w");//打开一个文件用来保存传送的文件
if(File==NULL){ printf("error in creating conserve file %s \n\a",buf);close(sockfd); return -1;}
else printf("the file is stored in %s.....\n",buffn);
fflush(NULL);
while((nsize=recv(con_fd,buf,MAXSIZE,0))!=0)//接收文件
fwrite(buf,1,nsize,File); close(sockfd);//关闭套接口
return 1; }
int main(){
int sockfd,sockfdfn;
char buffn[50];
sockfd=b_link(MYPORT);
if(b_access(sockfd,buffn)>0)printf("file accept end \n\a");
else { printf("file accept failed \n\a");return 0;}
return 1;}
//client.c
#include<sys/types.h>#include<sys/socket.h>#include<netdb.h>#include<string.h>
#include<stdlib.h>#include<stdio.h>#define MAXSIZE 8096#define MYPORT 12000
int b_connect(char *hostname,int mp){
int sockfd,ret,len;struct sockaddr_in ser_addr;char *myname;struct hostent *sh;struct in_addr *addrs;
if((sh=gethostbyname(hostname))==NULL){
if((sh=gethostbyaddr(hostname,4,AF_INET))==NULL){printf("the host name couldn't be expressed \n\a");return -1;}}
printf("connecting to %s ......\n",inet_ntoa(*(struct sockaddr *)sh->h_addr_list[0]));
addrs=(struct in_addr *)sh->h_addr_list[0];
sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个套接口
if(sockfd<0){printf("error in building socket \n\a");return -1;}
ser_addr.sin_family=AF_INET;//协议ip/tcp
ser_addr.sin_port=htons(mp);//主机监听端口,转换成网络数字形式
memcpy(&(ser_addr.sin_addr.s_addr),addrs,sizeof(struct in_addr));//主机ip地址,网络数字形式
bzero(&(ser_addr.sin_zero),8);
ret=connect(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr));//与主机建立连接
if(ret<0){printf("error in conneting \n\a");return -1;}
return sockfd;};
int f_send(int sockfd,char *fs){
if (send(sockfd,fs,50,0) == -1){perror( " send fname error " );return 0;}
else printf("file name transfers succussly! \n\a");
FILE *File;int nsize;int i=0;char temp[MAXSIZE];char buf[MAXSIZE];
File=fopen(fs,"r");//打开要传送的文件
if(File==NULL){printf("file: %s open failed!.....\n",fs);return -1; }
while((nsize=fread(buf,1,MAXSIZE,File))>0){send(sockfd,buf,nsize,0);}
if(feof(File)!=0)printf("file transfers succussly!\n%d",strlen(buf));
else printf("error in reading file \n\a");
fclose(File);close(sockfd);return 1;
};
int main(void){
int sockfd,sockfdfn;char hostname[100];char file[100];
printf("please input the hostname(ip) you want to connect:");
fflush(NULL);gets(hostname);
printf("connect success!\nplease input the filename you want to transfer:");
gets(file);fflush(NULL);
sockfd=b_connect(hostname,12000);
if(sockfd<=0) return -1;
return f_send(sockfd,file);}
B. linux c++里面怎么实现inet_ntoa这个函数的
加头文件 #include <arpa/inet.h> 就能调用该函数,为什么要自己实现呢?
C. Linux内核编程中有in_ntoa()或者类似的函数吗
char *inet_ntoa(struct in_addr inaddr )
Linux 库函数里面是有这个函数的,可以把32位自接续二进制转换成点分十进制的字符串
D. 如何使用inet_ntoa函数
#include <arpa/inet.h>包含头文件
unsigned int myip;
这里获取ip
printf("%s\n",inet_ntoa(myip));
E. inet_ntoa的基本介绍
功能:
将一个IP转换成一个互联网标准点分格式的字符串。
原型: char*inet_ntoa(structin_addrin);头文件:
arpa/inet.h
Winsock2.h
参数:
一个网络上的IP地址
返回值:
如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。
F. inet_ntoa()的介绍
linux下:函数声明:char *inet_ntoa (struct in_addr);返回点分十进制的字符串在静态内存中的指针。所在头文件:<arpa/inet.h>//end linux 下
G. linux下网络编程遇到一个小问题,C语言哦
inet_ntoa()在出错的时候会返回NULL,printf( "%s", NULL)会导致段错误
你可以先判断inet_ntoa()是否出错,出错的话用errno打出错误原因,例如:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct in_addr client;
char const *addr;
if ( ( addr = inet_ntoa( client)))
printf( "%s\n", addr);
else
printf( "inet_ntoa() failed: %s\n", strerror( errno));
return 0;
}
H. linux 网络编程问题
首先要明白什么是可重入性?
可重入函数主要是在多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;
而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
针对你的问题看看你的代码有没有使用全局变量或者其他的不可重入因子,
I. sprintf(buffer,"Welcome %s to ",inet_ntoa(addclient.sin_addr)) 由于inet_ntoa返回int型
inet_ntoa()返回的就是char * 我是在linux上 如果出现这种警告 说明你的头文件是不全的 就是没有加上包含这个函数的头文件 在linux上为#include<arpa/inet.h>