Socket:java与C之间的文件传送<1>(C语言之间的通信)

我觉得要清楚C与java之间是如何通讯的首先要清楚C与C之间是如何通讯的,JAVA与JAVA之间是怎样通讯的,java与c通信需要注意哪些地方,然后我们就可以让java与C进行相互痛心了!

首先来看一下C与c是如何通信的

  1. 服务器:  
  2. #include<stdio.h>  
  3. #include<winsock.h>  
  4. #pragma comment (lib,"wsock32.lib")  
  5. void main()  
  6. {  
  7.                 WSADATA data;  
  8.                 WSAStartup(MAKEWORD(2,0),&data);  
  9.     SOCKET socket1;  
  10.      struct sockaddr_in local;  
  11.    struct sockaddr_in from;  
  12.     int fromlen =sizeof(from);  
  13.   local.sin_family=AF_INET;  
  14.    local.sin_port=htons(1000);             ///监听端口  
  15.      local.sin_addr.s_addr=INADDR_ANY;       ///本机  
  16.        socket1=socket(AF_INET,SOCK_DGRAM,0);  
  17.        bind(socket1,(struct sockaddr*)&local,sizeof local);  
  18.     while (1)  
  19.    {  
  20.            char buffer[1024]="\0";  
  21.              printf("waiting for message from others-------------\n");  
  22.            if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)  
  23.                 {  
  24.                    printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);  
  25.                   给cilent发信息  
  26.                       sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);  
  27.   
  28.              }  
  29.    }  
  30.    closesocket(socket1);  
  31.                 WSACleanup();  
  32. }  
服务器:
#include<stdio.h>
#include<winsock.h>
#pragma comment (lib,"wsock32.lib")
void main()
{
                WSADATA data;
                WSAStartup(MAKEWORD(2,0),&data);
    SOCKET socket1;
     struct sockaddr_in local;
   struct sockaddr_in from;
    int fromlen =sizeof(from);
  local.sin_family=AF_INET;
   local.sin_port=htons(1000);             ///监听端口
     local.sin_addr.s_addr=INADDR_ANY;       ///本机
       socket1=socket(AF_INET,SOCK_DGRAM,0);
       bind(socket1,(struct sockaddr*)&local,sizeof local);
    while (1)
   {
           char buffer[1024]="\0";
             printf("waiting for message from others-------------\n");
           if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
                {
                   printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
                  给cilent发信息
                      sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);

             }
   }
   closesocket(socket1);
                WSACleanup();
}

首先来看一下服务器端大概的逻辑就是1:初始化体格套接字

2.绑定端口与ip

3.进行监听,

4.关闭套接字

  1. 客户端:  
  2. #include<stdio.h>  
  3. #include<winsock.h>  
  4. #pragma comment (lib,"wsock32.lib")  
  5.   
  6.  void main()  
  7. {  
  8.                 WSADATA data;  
  9.                 WSAStartup(MAKEWORD(2,0),&data);  
  10.                 SOCKET socket1;  
  11.  struct sockaddr_in server;  
  12.   int len =sizeof(server);  
  13.     server.sin_family=AF_INET;  
  14.   server.sin_port=htons(1000);                      ///server的监听端口  
  15.     server.sin_addr.s_addr=inet_addr("???.???.???.???"); ///server的地址   
  16.   
  17.       socket1=socket(AF_INET,SOCK_DGRAM,0);  
  18.        while (1)  
  19.    {  
  20.            char buffer[1024]="\0";  
  21.              printf("input message\n");  
  22.           scanf("%s",buffer);  
  23.          if (strcmp(buffer,"bye")==0)  
  24.                         break;  
  25.               if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)  
  26.          {         
  27.                     if (recvfrom(socket1,  
  28.                                         buffer,  
  29.                                         sizeof buffer,  
  30.                                         0,  
  31.                                         (struct sockaddr*)&server,&len) != SOCKET_ERROR)  
  32.                                 printf("rece from server:%s\n",buffer);  
  33.              }                 
  34.     }  
  35.    closesocket(socket1);  
  36.                 WSACleanup();  
  37. }  
客户端:
#include<stdio.h>
#include<winsock.h>
#pragma comment (lib,"wsock32.lib")

 void main()
{
                WSADATA data;
                WSAStartup(MAKEWORD(2,0),&data);
                SOCKET socket1;
 struct sockaddr_in server;
  int len =sizeof(server);
    server.sin_family=AF_INET;
  server.sin_port=htons(1000);                      ///server的监听端口
    server.sin_addr.s_addr=inet_addr("???.???.???.???"); ///server的地址 

      socket1=socket(AF_INET,SOCK_DGRAM,0);
       while (1)
   {
           char buffer[1024]="\0";
             printf("input message\n");
          scanf("%s",buffer);
         if (strcmp(buffer,"bye")==0)
                        break;
              if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)
         {       
                    if (recvfrom(socket1,
                                        buffer,
                                        sizeof buffer,
                                        0,
                                        (struct sockaddr*)&server,&len) != SOCKET_ERROR)
                                printf("rece from server:%s\n",buffer);
             }               
    }
   closesocket(socket1);
                WSACleanup();
}

再看一下客户端:

首先来看一下服务器端大概的逻辑就是1:初始化体格套接字

2.绑定端口与ip

3.向服务器发送数据请求,

4.关闭套接字


了解了通信原理再让我们看一下C与C语言之间用套接字是如何进行文件传输的呢!

  1. 服务器端  
  2. #include <WINSOCK2.H>  
  3. #include <stdio.h>  
  4. #pragma comment(lib,"ws2_32.lib")  
  5. #define SIZE 1024*8  
  6. void main()  
  7. {  
  8.     //创建套接字  
  9.     WORD myVersionRequest;  
  10.     WSADATA wsaData;  
  11.     myVersionRequest=MAKEWORD(1,1);  
  12.     int err;  
  13.     err=WSAStartup(myVersionRequest,&wsaData);  
  14.     if (!err)  
  15.     {  
  16.         printf("打开连接\n");  
  17.     }   
  18.     else  
  19.     {  
  20.         //进一步绑定套接字  
  21.         printf("连接打开失败");  
  22.         return;  
  23.     }  
  24.     SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字  
  25.     //需要绑定的参数  
  26.     SOCKADDR_IN addr;  
  27.     addr.sin_family=AF_INET;  
  28.     addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址  
  29.     addr.sin_port=htons(6000);//绑定端口  
  30.     bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成  
  31.     printf("绑定成功\n");  
  32.     listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数  
  33.     //  
  34.     //开始进行监听  
  35.     //  
  36.     SOCKADDR_IN clientsocket;  
  37.     int len=sizeof(SOCKADDR);  
  38.     char sendBuf[50];  
  39.     while(true)  
  40.     {  
  41.     SOCKET serConn;  
  42.     serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话就会不断的监听  
  43.     sprintf(sendBuf,"请求IP地址为%s",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里  
  44.     send(serConn,sendBuf,strlen(sendBuf)+1,0);//发送请求信息  
  45.     printf("客户端已打开\n请输入存放文件地址:\n");  
  46.     FILE *fp;//定义文件指针     
  47. /*  char path[100]={"0"};  
  48.     int i=0;  
  49.     while(path[i]!='\0')  
  50.     {  
  51.        if(path[i]=='/')  
  52.             path[i]='\\';  
  53.        i++;  
  54.     }  
  55.     gets(path);*/  
  56.     if((fp=fopen("hehehehe.xml","wb"))==NULL)  
  57.     {  
  58.        printf("文件未打开\n");  
  59.        printf("客户端已打开\n请输入存放文件地址:\n");  
  60.     }  
  61.     else  
  62.     {  
  63.        printf("文件已打开 开始文件传输......\n");  
  64.        //发送开始标志  
  65.        send(serConn,"开始传送",strlen("开始传送")+1,0);   
  66.        //得到文件大小  
  67.        char datalength[20];  
  68.        long int length=0;  
  69.      //  recv(serConn,datalength,21,0);  
  70.        length=atol(datalength);  
  71.        printf("得到文件大小: %d\n",length);  
  72.        //开始传送  
  73.        double cent=0.0;  
  74.        char receiveBuf[SIZE];  
  75.        long int x=0;  
  76.        while (1)  
  77.        {  
  78.        x=x+SIZE;  
  79.        if(x<length)  
  80.        {  
  81.             cent=(double)x*100.0/(double)length;  
  82.     //      printf("已接收: %4.2f%\n",cent);  
  83.             recv(serConn,receiveBuf,SIZE+1,0);  
  84.             fwrite(receiveBuf,1,SIZE,fp);  
  85.         }  
  86.        else  
  87.        {  
  88.             recv(serConn,receiveBuf,length+SIZE-x+1,0);  
  89.             printf("文件接收完毕\n");  
  90.             fwrite(receiveBuf,1,length+SIZE-x,fp);  
  91.             fclose(fp);  
  92.             break;  
  93.        }  
  94.        }  
  95.     }  
  96.     closesocket(serConn);//关闭  
  97.     }  
  98.     WSACleanup();//释放资源的操作  
  99.     system("pause");  
  100.   
  101. }  
服务器端
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
void main()
{
	//创建套接字
	WORD myVersionRequest;
	WSADATA wsaData;
	myVersionRequest=MAKEWORD(1,1);
	int err;
	err=WSAStartup(myVersionRequest,&wsaData);
	if (!err)
	{
		printf("打开连接\n");
	} 
	else
	{
		//进一步绑定套接字
		printf("连接打开失败");
		return;
	}
	SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
	//需要绑定的参数
	SOCKADDR_IN addr;
	addr.sin_family=AF_INET;
	addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址
	addr.sin_port=htons(6000);//绑定端口
	bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
	printf("绑定成功\n");
	listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数
	//
	//开始进行监听
	//
	SOCKADDR_IN clientsocket;
	int len=sizeof(SOCKADDR);
	char sendBuf[50];
	while(true)
	{
	SOCKET serConn;
	serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话就会不断的监听
	sprintf(sendBuf,"请求IP地址为%s",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
	send(serConn,sendBuf,strlen(sendBuf)+1,0);//发送请求信息
	printf("客户端已打开\n请输入存放文件地址:\n");
	FILE *fp;//定义文件指针	
/*	char path[100]={"0"};
	int i=0;
	while(path[i]!='\0')
	{
	   if(path[i]=='/')
		    path[i]='\\';
	   i++;
	}
	gets(path);*/
	if((fp=fopen("hehehehe.xml","wb"))==NULL)
	{
	   printf("文件未打开\n");
	   printf("客户端已打开\n请输入存放文件地址:\n");
	}
	else
	{
	   printf("文件已打开 开始文件传输......\n");
	   //发送开始标志
	   send(serConn,"开始传送",strlen("开始传送")+1,0); 
	   //得到文件大小
	   char datalength[20];
	   long int length=0;
	 //  recv(serConn,datalength,21,0);
	   length=atol(datalength);
	   printf("得到文件大小: %d\n",length);
	   //开始传送
	   double cent=0.0;
	   char receiveBuf[SIZE];
	   long int x=0;
	   while (1)
	   {
	   x=x+SIZE;
	   if(x<length)
	   {
		    cent=(double)x*100.0/(double)length;
	//	    printf("已接收: %4.2f%\n",cent);
		    recv(serConn,receiveBuf,SIZE+1,0);
		    fwrite(receiveBuf,1,SIZE,fp);
		}
	   else
	   {
		    recv(serConn,receiveBuf,length+SIZE-x+1,0);
			printf("文件接收完毕\n");
			fwrite(receiveBuf,1,length+SIZE-x,fp);
			fclose(fp);
			break;
	   }
	   }
	}
	closesocket(serConn);//关闭
	}
	WSACleanup();//释放资源的操作
	system("pause");

}

  1. 客户端:  
  2. #include <WINSOCK2.H>  
  3. #include <stdio.h>  
  4. #include <time.h>  
  5. #pragma comment(lib,"ws2_32.lib")  
  6. #define SIZE 1024*8  
  7. void main()  
  8. {  
  9.     FILE *fp;  
  10.     int err;  
  11.     int length=0;  
  12.   
  13.     SOCKET clientSocket;  
  14.     SOCKADDR_IN clientsock_in;  
  15.     char receiveBuf[100]={"0"};  
  16.     char ip_addr[16]={"127.0.0.1"};  
  17.     WORD versionRequired;  
  18.     WSADATA wsaData;  
  19.     versionRequired=MAKEWORD(1,1);  
  20.     err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息  
  21.     if (!err)  
  22.     {  
  23.         printf("客户端嵌套字已经打开!\n");  
  24.     }  
  25.     else  
  26.     {  
  27.         printf("客户端的嵌套字打开失败!\n");  
  28.         return;//结束  
  29.     }  
  30.     clientSocket=socket(AF_INET,SOCK_STREAM,0);  
  31.     /*printf("请输入主机IP:\n");  
  32.     scanf("%s",ip_addr);*/  
  33.     //连接服务器  
  34.     clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);  
  35.     clientsock_in.sin_family=AF_INET;  
  36.     clientsock_in.sin_port=htons(6000);  
  37.     if(connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR))!=SOCKET_ERROR)//开始连接  
  38.     {  
  39.     recv(clientSocket,receiveBuf,101,0);  
  40.     printf("%s\n",receiveBuf);   
  41.     char path[100]={"0"};  
  42.     int i=0;  
  43.     do  
  44.     {  
  45.        printf("请输入文件地址:\n");   
  46.        gets(path);  
  47.        while(path[i]!='\0')  
  48.        {  
  49.            if(path[i]=='/')  
  50.            path[i]='\\';  
  51.            i++;  
  52.        }  
  53.        i=0;  
  54.        if((fp=fopen(path,"rb"))==NULL)  
  55.        {  
  56.            i=1;  
  57.            printf("文件未打开\n");  
  58.        }  
  59.     }while(i);   
  60.   
  61.     fseek(fp,0L,SEEK_END);  
  62.     length=ftell(fp);  
  63.     printf("待传送文件大小: %d\n",length);  
  64.     printf("文件已经打开 等待主机消息......\n");  
  65.     //得到主机开始传送消息  
  66.     recv(clientSocket,receiveBuf,101,0);  
  67.     printf("%s\n",receiveBuf);  
  68.   
  69.     if(strcmp(receiveBuf,"开始传送")==0)  
  70.     {  
  71.        //传送文件长度  
  72.        char sendBuf[20];  
  73.        ltoa(length,sendBuf,10);  
  74.        send(clientSocket,sendBuf,21,0);  
  75.        fseek(fp,0L,SEEK_SET);  
  76.        //传送文件  
  77.        long int y=0;  
  78.        double cent;  
  79.        char trans[SIZE];  
  80.        while(!feof(fp))  
  81.        {  
  82.      
  83.            fread(trans,1,SIZE,fp);  
  84.            y=y+SIZE;  
  85.            if(y<length)  
  86.            {  
  87.                 cent=(double)y*100.0/(double)length;  
  88.             //  printf("已发送: %4.2f%\n",cent);  
  89.                 send(clientSocket,trans,SIZE+1,0);  
  90.                 Sleep(5);//此处的作用是防止服务器短写文件出错,如果不加的话会出现各种奇葩的乱码,时间需要根据数据的大小进行等待,等待系统写文件。当然了这里还有更好的方法,就是写完后向服务器再向服务器发送下次请求。  
  91.            }  
  92.            else  
  93.            {  
  94.                 send(clientSocket,trans,length+SIZE-y+1,0);  
  95.                 closesocket(clientSocket);  
  96.                 WSACleanup();  
  97.            }  
  98.        }  
  99.        fclose(fp);  
  100.     }  
  101.     printf("文件发送完毕\n");  
  102.     system("pause");  
  103.     }  
  104.     else  
  105.     {  
  106.         printf("未能连接到服务器程序退出!\n");  
  107.     }  
  108. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值