當前位置:首頁 » 操作系統 » inetntoalinux

inetntoalinux

發布時間: 2022-05-27 22:12:53

A. linux下網路編程文件傳送問題

我用的就是下面的代碼,就是不行,這就是我組合的,不知道哪裡出問題了,請高手指點。謝謝!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);返回點分十進制的字元串在靜態內存中的指針。所在頭文件:&lt;arpa/inet.h&gt;//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>

熱點內容
微信里的密碼和賬號在哪裡 發布:2025-01-11 22:46:04 瀏覽:750
java字元串個數統計 發布:2025-01-11 22:45:05 瀏覽:541
完美國際2捏臉資料庫 發布:2025-01-11 22:45:04 瀏覽:279
php淘寶互刷平台源碼 發布:2025-01-11 22:43:49 瀏覽:215
劍俠情緣緩存怎麼清理 發布:2025-01-11 22:33:56 瀏覽:316
win7旗艦版怎麼設置密碼 發布:2025-01-11 22:21:09 瀏覽:144
被害人訪問 發布:2025-01-11 22:06:24 瀏覽:366
朋友圈上傳長視頻方法 發布:2025-01-11 22:01:41 瀏覽:357
我的世界ice伺服器被炸罰款 發布:2025-01-11 21:54:36 瀏覽:725
linuxphpini配置 發布:2025-01-11 21:54:35 瀏覽:481