linux与window socket通信

引自:http://hi.baidu.com/lewutian/blog/item/881ae9f0c62d1bc87931aa19.html

 

linux是客户端,window是服务器端.通信socket编程把linux下的图片传到服务器

在linux客户端:    定义一个socket地址结构

//设置一个socket地址结构send_addr,代表发送端internet地址, 端口
    struct sockaddr_in send_addr;
    bzero(&send_addr,sizeof(send_addr)); //把一段内存区的内容全部设置为0
    send_addr.sin_family = AF_INET;
    send_addr.sin_addr.s_addr = htons(INADDR_ANY);
    send_addr.sin_port = htons(0);//系统自动获取端口

再定义一个socket:

//创建用于internet的流协议(TCP)socket,用send_socket代表服务器socket
    int send_socket = socket(PF_INET,SOCK_STREAM,0);

绑定socket与socket地址

bind(send_socket,(struct sockaddr*)&send_addr,sizeof(send_addr))

把数据发送给接收端,既服务器

while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0)//读取文件信息到buffer
            {
                printf("file_block_length = %d/n",file_block_length);
                //发送buffer中的字符串到send_socket,实际是给接收端,服务端
                if(send(send_socket,buffer,file_block_length,0)<0)
                {
                    printf("Send File:/t%s Failed/n", file_name);
                    break;
                }
                bzero(buffer, BUFFER_SIZE);
            }

客户端程序基本编写完毕.

服务器端:

memset(&receive_addr,0,sizeof(struct sockaddr_in)); //
    receive_addr.sin_family = AF_INET;
    receive_addr.sin_addr.s_addr = htons(INADDR_ANY);
    receive_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

/* 服务器端开始建立socket描述符 */
receive_socket=socket(AF_INET,SOCK_STREAM,0);
    if( receive_socket < 0)
    {
        if (WSAGetLastError() == WSANOTINITIALISED)
            {
                printf("Error:WSANOTINITIALISED,please Call WSAStartup first/n");
                return 0;
            }
            else
            {
                int err =WSAGetLastError();
                printf("Bind error:%s,errorcode :%d/n",strerror(errno),err);
                return 0;
            }
    }
   
    //
    if( bind(receive_socket,(struct sockaddr*)&receive_addr,sizeof(receive_addr)))
    {
        int err = WSAGetLastError();
        printf("Bind error:%s,errorcode :%d/n",(const char *)strerror(errno),err);
        return 0;

    }

    //
    if ( listen(receive_socket, LENGTH_OF_LISTEN_QUEUE) )
    {
        printf("Listen error:%s/n/a",strerror(errno));
        return 0;
    }

    while (1) //
    {
        //
        struct sockaddr_in send_addr;
        length = sizeof(send_addr);

        new_server_socket = accept(receive_socket,(struct sockaddr*)&send_addr,&length);
        if ( new_server_socket == INVALID_SOCKET)
        {
           printf("Accept error:%s/n/a",strerror(errno));
           break;
        }

        printf("the remote ip is %s/n",inet_ntoa(send_addr.sin_addr));

   memset(buffer,0,BUFFER_SIZE); //
        length = recv(new_server_socket,buffer,BUFFER_SIZE,0);//
        if (length < 0)
        {
            printf("Server Recieve Data Failed!/n");
            break;
        }

        memset(file_name,0, FILE_NAME_MAX_SIZE+1);
        strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));

        printf("filename is %s/n",file_name);
        fp = fopen(file_name,"wb");//以二进制打开
        if(NULL == fp )
        {
             printf("File:/t%s Can Not Open To Write/n", file_name);
             exit(1);
        }

        //
       memset(buffer,0,BUFFER_SIZE);
       lengther = 0;
       while( lengther = recv(new_server_socket,buffer,BUFFER_SIZE,0))
       {
    //printf("the lengther is %d/n",lengther);
          if(lengther < 0)
          {
            printf("Recieve Data From Server Failed!/n");
            break;
          }
    //printf("buffer size is %d/n",strlen(buffer));
          write_length = fwrite(buffer,sizeof(char),lengther,fp);
          if (write_length<lengther)
         {
             printf("File:/t%s Write Failed/n", file_name);
             break;
         }
         memset(buffer,0,BUFFER_SIZE);
   lengther=0;
      }
      printf("Recieve File:/t %s From Server Finished/n",file_name);
   
      fclose(fp);
      closesocket(new_server_socket);
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值