c语言使用socket发送图片文件大小正确,但是无法打开是怎么回事? 20C

使用c语言socket通信写了一个客户端与服务器,然后客户端向服务器发送文件,服务器接收。使用自己定义的数据包协议,服务器使用单线程epoll。最后测试时,文本文件发送没有问题,但是发送图片文件,最后图片的大小没有问题,但是无法打开,提示错误:分析 JPEG 图像文件时出错(Improper call to JPEG library in state 201) 。
文件的操作使用linux下系统调用read,write,open 。请问问题可能出现在哪里?

4个回答

改用unsigned char 数组作为读写数据的类型;不要用char数组

fengxinlinux
Rotation. 非常感谢,改成unsigned后成功了。但是我还有点不太明白为什么不使用unsigned会出错,不是以流形式把数据发出去就行了吗,有无符号为什么会影响最后的数据啊?并且我写了个demo,就是用open打开一个图片,然后再创建一个文件,从这个文件读过去,然后写到新创的文件里,也是用的char ,但是最后图片就能正常打开
2 年多之前 回复

服务器代码:

#include<iostream>
#include<cstring>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/signal.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/epoll.h>
#include<errno.h>

using namespace std;

#define NET_PACKET_DATA_SIZE 5000 
#define PORT 6666   //服务器端口
#define LISTEN_SIZE 1023   //连接请求队列的最大长度
#define EPOLL_SIZE  1023   //epoll监听客户端的最大数目

int ss=0;///////////

/// 网络数据包包头  
struct NetPacketHeader  
{  
    unsigned short      wDataSize;  ///< 数据包大小,包含封包头和封包数据大小  
    unsigned short      wOpcode;    ///< 操作码  
};  

/// 网络数据包  
struct NetPacket  
{  
    NetPacketHeader     Header;                         ///< 包头  
    unsigned char       Data[NET_PACKET_DATA_SIZE];     ///< 数据  
};  



/// 网络操作码  
enum eNetOpcode  
{  
    NET_TEST1  = 1,  
};  

struct File_message
{
    char filename[100];  //文件名
    long filesize;  //文件大小
};

struct File_data
{
    char filename[100];  //文件名
    char buffer[1024]; //文件内容
};

void my_err(const char *err_string,int line)  //自定义错误函数
{
    cerr<<"line:"<<line<<endl; //输出错误发生在第几行
    perror(err_string);       //输出错误信息提示
    exit(1);
}

bool dealwithpacket(int conn_fd,char *recv_data,uint16_t wOpcode,int datasize)  //处理接收到的数据
{
    cout<<++ss<<":"<<"datasize"<<datasize<<endl;///////////////////

    int fd;
    if(wOpcode==1)  //接收文件信息
    { 
        File_message *file_message=(File_message*)recv_data;
        strcat(file_message->filename,"(2)");


        if((fd=open(file_message->filename,O_RDWR|O_APPEND|O_CREAT,0777))<0)
        {
            cout<<"创建文件失败"<<endl;
            return false;
        }
    }
    else if(wOpcode==2)  //接收文件内容
    {

        File_data * file_data=(File_data*)recv_data;

        strcat(file_data->filename,"(2)");
        if((fd=open(file_data->filename,O_RDWR|O_APPEND))<0)
        {
            cout<<"打开文件失败"<<endl;
            return false;
        }
        if(write(fd,file_data->buffer,datasize-sizeof(file_data->filename))<0)
        {
            cout<<"写入文件失败"<<endl;
            return false;
        }
        close(fd);
    }
   return true;

}

bool server_recv(int conn_fd)  //接收数据函数
{
    int nrecvsize=0; //一次接收到的数据大小
    int sum_recvsize=0; //总共收到的数据大小
    int packersize;   //数据包总大小
    int datasize;     //数据总大小
    char recv_buffer[10000];  //接收数据的buffer


    memset(recv_buffer,0,sizeof(recv_buffer));  //初始化接收buffer


    while(sum_recvsize!=sizeof(NetPacketHeader))
    {
        nrecvsize=recv(conn_fd,recv_buffer+sum_recvsize,sizeof(NetPacketHeader)-sum_recvsize,0);
        if(nrecvsize==0)
        {
            cout<<"从客户端接收数据失败"<<endl;
            return false;
        }
        sum_recvsize+=nrecvsize;

    }



    NetPacketHeader *phead=(NetPacketHeader*)recv_buffer;
    packersize=phead->wDataSize;  //数据包大小
    datasize=packersize-sizeof(NetPacketHeader);     //数据总大小




    while(sum_recvsize!=packersize)
    {
        nrecvsize=recv(conn_fd,recv_buffer+sum_recvsize,packersize-sum_recvsize,0);
        if(nrecvsize==0)
        {
            cout<<"从客户端接收数据失败"<<endl;
            return false;
        }
        sum_recvsize+=nrecvsize;
    }


    dealwithpacket(conn_fd,(char*)(phead+1),phead->wOpcode,datasize);



}
int main()
{

    int sock_fd;  //监听套接字
    int conn_fd;    //连接套接字
    int epollfd;  //epoll监听描述符
    socklen_t cli_len;  //记录连接套接字地址的大小
    struct epoll_event  event;   //epoll监听事件
    struct epoll_event*  events;  //epoll监听事件集合
    struct sockaddr_in cli_addr;  //客户端地址
    struct sockaddr_in serv_addr;   //服务器地址



    //创建一个套接字
    sock_fd=socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd<0)
    {
        my_err("socket",__LINE__);
    }
    //设置该套接字使之可以重新绑定端口
    int optval=1;
    if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,(void*)&optval,sizeof(int))<0)
    {
        my_err("setsock",__LINE__);
    }
    //初始化服务器端地址结构
    memset(&serv_addr,0,sizeof(struct sockaddr_in));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(PORT);
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    if(bind(sock_fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))<0)
    {
        my_err("bind",__LINE__);
    }
    //将套接字转化为监听套接字
    if(listen(sock_fd,LISTEN_SIZE)<0)
    {
        my_err("listen",__LINE__);
    }


    cli_len=sizeof(struct sockaddr_in);
    events=(struct epoll_event*)malloc(sizeof(struct epoll_event)*EPOLL_SIZE); //分配内存空间

    //创建一个监听描述符epoll,并将监听套接字加入监听列表
    epollfd=epoll_create(EPOLL_SIZE);
    if(epollfd==-1)
    {
        my_err("epollfd",__LINE__);
    }
    event.events = EPOLLIN;
    event.data.fd = sock_fd;
    if(epoll_ctl(epollfd,EPOLL_CTL_ADD,sock_fd,&event)<0)
    {
        my_err("epoll_ctl",__LINE__);
    }

    while(1)   //循环监听事件
    {
        int sum=0,i;
        sum=epoll_wait(epollfd,events,EPOLL_SIZE,-1);
        for(i=0;i<sum;i++)
        {
            if(events[i].data.fd==sock_fd)    //客户端请求连接
            {
                conn_fd=accept(sock_fd,(struct sockaddr*)&cli_addr,&cli_len);
                if(conn_fd<0)
                {
                    my_err("accept",__LINE__);
                }
                event.events = EPOLLIN | EPOLLRDHUP; //监听连接套接字的可读和退出
                event.data.fd = conn_fd;
                if(epoll_ctl(epollfd,EPOLL_CTL_ADD,conn_fd,&event)<0) //将新连接的套接字加入监听
                {
                    my_err("epoll",__LINE__);
                }
                cout<<"a connet is connected,ip is "<<inet_ntoa(cli_addr.sin_addr)<<endl;

            }
            else if(events[i].events&EPOLLIN)    //客户端发来数据
            {

                server_recv(events[i].data.fd);  //接收数据包并做处理

            }
            if(events[i].events&EPOLLRDHUP) //客户端退出
            {
                cout<<"a connet is quit,ip is "<<inet_ntoa(cli_addr.sin_addr)<<endl;
                epoll_ctl(epollfd,EPOLL_CTL_DEL,events[i].data.fd,&event);
                close(events[i].data.fd);
            }

        }
    }

}


客户端代码:

#include<iostream>
#include<string.h>
#include<math.h>
#include<sys/signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<time.h>

#define PORT 6666   //服务器端口
#define NET_PACKET_DATA_SIZE 5000  
using namespace std;



struct File_message    //文件信息类
{
    char filename[100]; //文件名
    long filesize;  //文件大小

};

struct File_data   //文件内容类
{
    char filename[100];  //文件名
    char buffer[1024];  //文件内容
};

void my_err(const char *err_string,int line)  //自定义错误函数
{
    cerr<<"line:"<<line<<endl; //输出错误发生在第几行
    perror(err_string);       //输出错误信息提示
    exit(1);
}

/// 网络数据包包头  
struct NetPacketHeader  
{  
    unsigned short      wDataSize;  ///< 数据包大小,包含封包头和封包数据大小  
    unsigned short      wOpcode;    ///< 操作码  
};  

/// 网络数据包  
struct NetPacket  
{  
    NetPacketHeader     Header;                         ///< 包头  
    unsigned char       Data[NET_PACKET_DATA_SIZE];     ///< 数据  
};  


/// 网络操作码  
enum eNetOpcode  
{  
    NET_TEST1 = 1, //发送文件信息
    NET_TEST2 = 2, //发送文件内容
};  


bool send_to_serv(int conn_fd,char *data_buffer,int datasize,uint16_t wOpcode) //向服务器发送数据
{
    NetPacket send_packet;
    send_packet.Header.wDataSize=datasize+sizeof(NetPacketHeader);  //数据包大小
    send_packet.Header.wOpcode=wOpcode;
    memcpy(send_packet.Data,data_buffer,datasize);




    if(send(conn_fd,&send_packet,send_packet.Header.wDataSize,0))
       return true;
    else
       return false;

}


bool send_file(int conn_fd)   //向服务器发送文件
{
    char send_buffer[1024]; //发送数据buffer
    string filename;  //文件路径名
    int fd; //文件描述符
    struct stat file_buffer;  //文件属性buffer
    File_message file_message;   //文件信息
    File_data file_data;
    int nsize=0;
    int sum_size=0;


    int ss=0;///////////////////////////

    memset(send_buffer,0,sizeof(send_buffer));

    cout<<"请输入要发送的文件路径及文件名"<<endl;
    getline(cin,filename);

    if(fd=open(filename.c_str(),O_RDONLY)<0)
    {
        my_err("open file error",__LINE__);
    }
    if(stat(filename.c_str(),&file_buffer)<0)
    {
        my_err("stat file error",__LINE__);
    }

    strcpy(file_message.filename,filename.c_str());
    file_message.filesize=file_buffer.st_size;



    if(send_to_serv(conn_fd,(char*)&file_message,sizeof(file_data),NET_TEST1)<0)
    {
        cout<<"向服务器发送文件信息失败"<<endl;
    }

    cout<<++ss<<":"<<"datasize "<<sizeof(file_data)<<endl; //////////////////

    close(fd);
    if((fd=open(filename.c_str(),O_RDONLY))<0)
       {
           my_err("打开文件失败",__LINE__);
       }

    while(nsize=read(fd,send_buffer,sizeof(send_buffer)))
    {


        memset(&file_data,0,sizeof(file_data));
        strcpy(file_data.filename,filename.c_str());
        strncpy(file_data.buffer,send_buffer,nsize);

        send_to_serv(conn_fd,(char*)&file_data,nsize+sizeof(file_data.filename),NET_TEST2);


        cout<<++ss<<":"<<"datasize "<<sizeof(file_data.filename)+nsize<<endl;///////////

        sum_size+=nsize;
    }



    if(sum_size==file_buffer.st_size)
    {
        cout<<"发送文件成功"<<endl;
        close(fd);
        return true;
    }
    else
    {
        cout<<"发送文件出错"<<endl;
        close(fd);
        return false;
    }

}

int main(int argc ,char **argv)
{
    int conn_fd; //创建连接套接字
    struct sockaddr_in serv_addr; //储存服务器地址

    if(argc!=3)    //检测输入参数个数是否正确
    {
        cout<<"Usage: [-a] [serv_address]"<<endl;
        exit(1);
    }


    //初始化服务器地址结构
    memset(&serv_addr,0,sizeof(struct sockaddr_in));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(PORT);

    //从命令行服务器地址
    for(int i=0;i<argc;i++)
    {
        if(strcmp("-a",argv[i])==0)
        {

            if(inet_aton(argv[i+1],&serv_addr.sin_addr)==0)
            {
                cout<<"invaild server ip address"<<endl;
                exit(1);
            }
            break;
        }
    }

    //检查是否少输入了某项参数
    if(serv_addr.sin_addr.s_addr==0)
    {
        cout<<"Usage: [-a] [serv_address]"<<endl;
        exit(1);
    }

    //创建一个TCP套接字
    conn_fd=socket(AF_INET,SOCK_STREAM,0);


    if(conn_fd<0)
    {
        my_err("connect",__LINE__);
    }

    //向服务器发送连接请求
    if(connect(conn_fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr))<0)
    {
        my_err("connect",__LINE__);
    }


    send_file(conn_fd);  //向服务器发送文件


    sleep(60);

}

对比双方的数据是否一致。。。还有文件的文件格式。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言socket建立的简单文件传输问题
# 客户端发送文件 #include<stdio.h> #include<sys/stat.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<fcntl.h> #include<string.h> int main(int argc,char **argv) { ssize_t i=1; char buf[512]; int fp; int ret; int socket_client; struct sockaddr_in addr_in; socket_client = socket(AF_INET,SOCK_STREAM,0);//创建套接字 if(socket_client<0){ perror("socket err"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9001); addr_in.sin_addr.s_addr = inet_addr("192.168.1.77"); ret = connect(socket_client,(struct sockaddr *)&addr_in,sizeof(addr_in));//链接 if(ret<0){ perror("connect err"); return -2; } scanf("%s",buf);//写入文件名 ret = send(socket_client,&buf,sizeof(buf),0);//发送文件名 if(ret<0){ perror("send err"); return -11; } fp = open(buf,O_RDONLY);//打开要发送的文件 if(fp<0){ fprintf(stderr,"open err\n"); return -1; } while(1){ if(i==0){ break; } memset(buf,0,sizeof(buf));//空间清0 i = read(fp,buf,sizeof(buf));//读文件到buf if(i<0){ perror("read err"); return -7; }else if(i==0){ break; } printf("%s\n",buf);//打印一遍用于观察 ret = send(socket_client,buf,sizeof(buf),0);//发送读取到的内容 if(ret<0){ perror("send err"); return -8; } printf("%d\n",ret);//打印发送的大小 sleep(1); } close(socket_client); return 0; } ## 服务器接收文件 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/stat.h> #include<arpa/inet.h> #include<unistd.h> #include<string.h> #include<stdlib.h> #include<fcntl.h> int main(int aegc,char **argv) { char buf[512]; ssize_t i; int fp; int ret; int socket_sever; int socket_client; struct sockaddr_in addr_in; socket_sever = socket(AF_INET,SOCK_STREAM,0);//定义socket套接字 if(socket_sever<0){ perror("socket err"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9001); addr_in.sin_addr.s_addr = inet_addr("192.168.1.77"); ret = bind(socket_sever,(struct sockaddr *)&addr_in,sizeof(addr_in));//绑定 if(ret<0){ perror("bind err"); return -2; } ret = listen(socket_sever,5);//监听 if(ret<0){ perror("listen err"); return -3; } socket_client = accept(socket_sever,NULL,NULL);//建立链接 if(socket_client<0){ perror("accept err"); return -4; } ret = recv(socket_client,&buf,sizeof(buf),0);//接收文件明 if(ret<0){ perror("recv err"); return -6; } fp = open(buf,O_WRONLY | O_CREAT | O_APPEND,0644);//创建并打开文件 if(fp<0){ fprintf(stderr,"open err"); return -1; } while(1){ if(i==0){ break; } memset(buf,0,sizeof(buf));//接收空间清0 ret = recv(socket_client,buf,sizeof(buf),0);//接收 if(ret<0){ perror("recv err"); return -6; }else if(ret==0){ break; } printf("%s\n",buf);//打印一遍用于观察 i = write(fp,buf,sizeof(buf));//写入打开的文件 if(i<0){ perror("write err"); return -13; }else if(i==0){ break;} sleep(1); } close(socket_sever); close(socket_client); } 问题出现在写入完成后末尾出现连续的^@^@^@^@^@^@^@^@符号,占用空间
c++如何通过socket发送zip文件?
我的系统是ubuntu14.04,我可以在本机上发送zip文件,大概的操作方法是服务端用fstream直接读zip文件,然后把它存在字符串里,在把字符串发到客户端,将字符串在写到文件里。在本机上,这个方法可以实现,但我现在发到mac上就丢失了很多内容,现在我觉得应该是编码的问题,应该怎么稳定的发送zip文件?
tcp socket:如何获得socket发送缓冲区剩余空间的大小
tcp socket:如何获得socket发送缓冲区剩余空间的大小
c++和c语言socket的区别
之前学了c语言socket,现在想用c++写个MFC通信,过程中发现不知道自己是在用c语言还是c++,而且网上的c++通信好杂,有的用CSOCKET,有的用CREATE创建套接字,有的Send大写,有的send小写,还有recv和大写的Receive,我完全混了,搞不清哪个是用c++语言开发的,还有头文件也不同,有的是winsock2,有的是afxsocket。。。求解答
C语言 socket 如何发送带指针的结构体?
发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出。 但是接收的时候,怎么接收到结构体中?thanks!
java socket和arm架构c语言硬件程序的tcp数据收发问题
RT,可以建立socket连接,但只要进行read write读写操作,无论是字符流还是字节流都会报exception,connection reset,以读数据为例,readall,read,readline全试过也无效
java和c使用socket通信时,发送报文的问题
问题详细描述:java是客户端,c语言是服务端。程序的目的是java发送报文过去 ,服务器能够识别。但是c语言写的服务端是很多年前的,目前已经无法对服务端作任何修改,c接收报文是用char定义的,报文是定长报文,不够的用空格补全,格式为包头+报文长度+报文内容(1字节+4字节+300字节),包头是6,报文长度是0300,报文内容由下图的结构体定义。![图片说明](https://img-ask.csdn.net/upload/201912/23/1577087403_15537.png)java使用getBytes()方法,获取了字节数组,发送过去后服务端报错,报错信息为包头错误,后来发现那边接收的是6对应ASCII码,请问这应该如何解决呢?java测试代码如下 ``` package Demo01; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class send { public static void main(String[] args) { try { iSend("172.33.xx.xx",10000); } catch (IOException e) { e.printStackTrace(); } } public static void iSend(String IP,int PORT) throws IOException{ String baotou = "6"; String blen= "0300"; String id = "0001"; String sysid = "1111"; String sysname = "disk"; String type = "11"; String level = "1"; String content = "sendcontent"; Socket socket = null; BufferedOutputStream bos = null; String message = "" ; List <Object> messList = new ArrayList(); messList.add(baotou); messList.add(blen); messList.add(id); messList.add(sysid); messList.add(sysname); messList.add(type); messList.add(level); messList.add(content); List <Object> messList2 = new ArrayList(); messList2.add(changeString(messList.get(0).toString(),1)); messList2.add(changeString(messList.get(1).toString(),4)); messList2.add(changeString(messList.get(2).toString(),4)); messList2.add(changeString(messList.get(3).toString(),8)); messList2.add(changeString(messList.get(4).toString(),16)); messList2.add(changeString(messList.get(5).toString(),16)); messList2.add(changeString(messList.get(6).toString(),16)); messList2.add(changeString(messList.get(7).toString(),240)); for(Iterator<Object> it = messList2.iterator();it.hasNext();){ message += it.next(); } System.out.println("报文为:"+message); try { socket = new Socket(IP,PORT); bos = new BufferedOutputStream(socket.getOutputStream()); byte [] buf = message.getBytes(); bos.write(buf,0,buf.length); bos.flush(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(socket != null){ socket.close(); } } } /** * *设置定长报文,用空格补齐 * @param object 报文集合 * @param len 报文的规定长度 * @return */ public static String changeString(String list,int len){ for(int ListLen = list.length();ListLen < len;ListLen++){ list +=" "; } return list; } } ```
C#通过Socket实现多文件传输
大概需求是客户端发送一个xml文件名给服务器,服务器返回xml文件。这一步没问题。 后面客户端需要解析xml文件,根据解析出的文件名,去服务器获取指定文件。现在问题是第一次服务器发送xml文件之后就侦听不到客户端后面的请求了 服务端代码: ``` #region 窗体加载 private void Form1_Load(object sender, EventArgs e) { Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Socket设置、IPv4、Stream类型套接字、TCP协议 IPAddress ip = IPAddress.Any;//获取本机IP IPEndPoint point = new IPEndPoint(ip, 18002);//设置IP和端口 socketWatch.Bind(point);//绑定端口 memoEdit1.Text = "开始侦听..."; socketWatch.Listen(100);//最大连接数 Thread th = new Thread(SendFileFuncssss);//创建新线程 th.Start(socketWatch);//启动线程 th.IsBackground = true;//设置后台运行线程 } #endregion #region 根据客户端传输文件名发送指定文件 public void SendFileFuncssss(object obj) { Socket socket = obj as Socket; while (true) { Socket socketServices = socket.Accept(); byte[] buffer = new byte[1024]; int num = socketServices.Receive(buffer);//接收到字节数 string str = Encoding.UTF8.GetString(buffer, 1, num - 1);//接收到字符串 if (buffer[0] == 0)//表示接收到的是消息数据 { TxtAddContent(socketServices.RemoteEndPoint + "连接成功"); string FileName = str; if (FileName.Equals("AutoUpdater.xml"))//获取xml配置文件 { //发送XML文件到客户端 using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + FileName, FileMode.Open)) { byte[] arrFile = new byte[1024 * 1024 * 5]; int length = fs.Read(arrFile, 0, arrFile.Length); byte[] arrFileSend = new byte[length + 1]; arrFileSend[0] = 1; // 用来表示发送的是xml文件数据 Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); socketServices.Send(arrFileSend);// 发送数据到客户端 } } if (!FileName.Equals("AutoUpdater.xml")) { //发送更新文件到客户端 using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "\\FileFolder\\" + FileName, FileMode.Open)) { byte[] arrFile = new byte[1024 * 1024 * 50]; int length = fs.Read(arrFile, 0, arrFile.Length);//获取文件长度 byte[] arrFileSend = new byte[length + 1]; arrFileSend[0] = 1; // 用来表示发送的是xml文件数据 Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); socketServices.Send(arrFileSend);// 发送数据到服务端 } } } } } #endregion ``` 客户端代码: ``` Socket socketClient = obj as Socket; socketClient.Connect(ipEndPoint); #region 修改本地文件名称 string Oldpath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater.xml";//修改前名称 string Newpath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater_Back.xml";//修改后名称 if (File.Exists(Oldpath)) { File.Delete(Newpath); File.Move(Oldpath, Newpath);//更改文件名 } #endregion if (socketClient.Connected) { try { TxtReceiveAddContent("连接成功"); //发送链接成功提示 byte[] arrMsg = Encoding.UTF8.GetBytes("AutoUpdater.xml"); byte[] arrSendMsg = new byte[arrMsg.Length + 1];//加一位标识用于表示是文字消息还是文件 arrSendMsg[0] = 0; // 用来表示发送的是消息数据 Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); socketClient.Send(arrSendMsg); //获取文件 string dirPath = Application.StartupPath; byte[] buffer = new byte[1024 * 1024 * 5]; int lenght = socketClient.Receive(buffer); if (buffer[0] == 1) { using (FileStream fs = new FileStream(dirPath + "\\AutoUpdater.xml", FileMode.Create)) { fs.Write(buffer, 1, lenght - 1); } TxtReceiveAddContent("配置文件接收成功:AutoUpdater.xml");//追加提示备注 } #region 获取XML里需要更新的文件和需要删除的文件 List<string> updatelist = new List<string>();//需要更新的文件集合 List<string> deletelist = new List<string>();//需要更新的文件集合 //获取历史xml文件更新时间以及更新版本 XDocument Olddocument = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater_Back.xml"); //获取到XML的根元素进行操作 XElement Oldroot = Olddocument.Root; XElement Oldele = Oldroot.Element("UpdateInfo"); //获取旧更新时间标签的值 XElement OldUpdateTime = Oldele.Element("UpdateTime"); //获取旧版本号标签的值 XElement OldVersion = Oldele.Element("Version"); //获取最新xml文件更新时间以及更新版本 XDocument Newdocument = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater.xml"); //获取到XML的根元素进行操作 XElement Newroot = Newdocument.Root; XElement Newele = Newroot.Element("UpdateInfo"); //获取旧更新时间标签的值 XElement NewUpdateTime = Newele.Element("UpdateTime"); //获取旧版本号标签的值 XElement NewVersion = Newele.Element("Version"); if (NewUpdateTime != OldUpdateTime || NewVersion != OldVersion) { //获取需要更新的文件列表 XElement NewUpList = Newroot.Element("UpdateList"); IEnumerable<XElement> UpList = NewUpList.Elements(); foreach (XElement item in UpList) { updatelist.Add(item.Value); } //获取需要删除的文件列表 XElement NewDelList = Newroot.Element("DeleteList"); IEnumerable<XElement> DelList = NewDelList.Elements(); foreach (XElement item in DelList) { deletelist.Add(item.Value); } } #endregion #region 循环获取更新文件 for (int i = 0; i < updatelist.Count; i++) { //发送链接成功提示 byte[] FileName = Encoding.UTF8.GetBytes(updatelist[i]); byte[] SendFileName = new byte[FileName.Length + 1];//加一位标识用于表示是文字消息还是文件 SendFileName[0] = 0; // 用来表示发送的是消息数据 Buffer.BlockCopy(FileName, 0, SendFileName, 1, FileName.Length); socketClient.Send(SendFileName); //获取文件 string FilePath = Application.StartupPath + "\\WebFile"; byte[] bufferByFile = new byte[1024 * 1024 * 50]; int lenghtByFile = socketClient.Receive(bufferByFile); if (bufferByFile[0] == 1) { using (FileStream fs = new FileStream(FilePath + "\\" + updatelist[i], FileMode.Create)) { fs.Write(bufferByFile, 1, lenghtByFile - 1); } TxtReceiveAddContent("文件接收成功:" + updatelist[i]); } } #endregion #region 循环删除指定文件 for (int i = 0; i < deletelist.Count; i++) { try { string path = AppDomain.CurrentDomain.BaseDirectory + "\\WebFile\\" + deletelist[i]; File.Delete(path); TxtReceiveAddContent("删除文件[" + deletelist[i] + "]成功"); } catch (Exception) { TxtReceiveAddContent("删除文件[" + deletelist[i] + "]失败"); continue; } } #endregion } catch (Exception ex) { File.Move(Newpath, Oldpath);//连接失败,还原文件名 MessageBox.Show(ex.ToString()); throw; } ``` 调试在客户端进循环的时候服务端侦听不到了 刚接触socket,多谢大佬们解答
C语言UDP SOCKET编程求助
本人初入计算机网络,最近在编写一个简单的UDP模型,主要功能是1.Server先开启监听 2.Client用sendto发送一条信息 3.Server用recvfrom接收 4.再用sendto回复 5.Client用recvfrom接收 参考了一些例子,但是从第四步开始总出错,ERRNO为97(#define EAFNOSUPPORT 97 /* Address family not supported by protocol */)在网上搜索无果,希望有经验的朋友们帮助一下我,十分谢谢!!! 我用C语言在UBUNTU18.10下实现。 以下是代码及运行结果: ``` UDPServer.c #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define PORT 8004 //远端地址端口号 void main(void) { int serverSocket,peerlen,buflen; char buf[200]; struct sockaddr_in local_addr,addr_from; if(-1==(serverSocket=socket(AF_INET,SOCK_DGRAM,0))) puts("socket开启失败"); else puts("socket开启成功"); bzero(&local_addr, sizeof(local_addr));//清空字节 local_addr.sin_family = AF_INET; local_addr.sin_port = htons(PORT); local_addr.sin_addr.s_addr =INADDR_ANY;//s_addr到底是个什么类型? //inet_addr是一个计算机函数,功能是将一个点分十进制的IP //转换成一个长整数型数(u_long类型)等同于inet_addr()。 if(bind(serverSocket,(struct sockaddr*)&local_addr, sizeof(local_addr))==-1) printf("%s\n","绑定失败"); else printf("%s\n","绑定成功"); if(-1==(buflen=recvfrom(serverSocket,buf,strlen(buf),0,(struct sockaddr *)&addr_from,&peerlen))) puts("接受失败\n"); else puts("接受成功\n"); puts(buf); if(-1==(int)sendto(serverSocket,"REC",strlen("REC"),0, (struct sockaddr *)&addr_from,sizeof(addr_from))) puts("发送失败\n"); else puts("发送成功\n"); close(serverSocket); printf("%d",errno); } UDPClient.c #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define PORT 8004 //远端地址端口号 void main(void) { int clientSocket,buflen,addrlen,peerlen; char addr[]="10.14.21.68",buf[200]; struct sockaddr_in remoteaddr,addr_from; if(-1==(clientSocket=socket(AF_INET,SOCK_DGRAM,0))) puts("socket开启失败"); else puts("socket开启成功"); bzero(&remoteaddr, sizeof(remoteaddr));//清空字节 remoteaddr.sin_family = AF_INET; remoteaddr.sin_port = htons(PORT); remoteaddr.sin_addr.s_addr =inet_addr(addr); if(-1==(sendto(clientSocket,"HI",strlen("HI"),0, (struct sockaddr *)&remoteaddr,addrlen=sizeof(remoteaddr)))) puts("发送失败\n"); else puts("发送成功\n"); if(-1==(buflen=recvfrom(clientSocket,buf,sizeof(buf),0, (struct sockaddr *)&remoteaddr,&addrlen))) puts("接受失败\n"); else puts("接受成功\n"); puts(buf); close(clientSocket); } 运行结果 Server: socket开启成功 绑定成功 接受成功 HI3Z� 发送失败 97 Client: socket开启成功 发送成功 ```
java socket客户端往服务器端发送文件
java socket客户端往服务器端发送文件包括二进制文件word文件, 请问文件传输的通讯协议该如何定义,不知道怎么自定义通讯协议。 我所说的发送文件是指多个文件,不是简单的一个文件。我想要的是自定义协议,客户端与 服务器端通讯的协议。
C语言中SOCKET编译不了
``` #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib" void main() { //main开头 int ret; WSADATA wsaData; ret = WSAStartup(0x11,&wsaData); if(ret == SOCKET_ERROR) { perror("failed to start up"); return; } SOCKET server; } ``` 编译出来提示错误 1 error C2275: “SOCKET”: 将此类型用作表达式非法
socket 编程问题(C语言)
客户端将要处理的文件/数据传输到服务器端,服务器端对此文本文件进行处理,并将结果传输给客户端,客户端进行显示。 我初学socket编程,请大家多指教。使用C语言
C#Socket编程,能实现客户端发送一个txt文件即可,怎么写?
C#Socket编程,只写客户端(127.0.0.1:5555),能实现发送一个txt文件到服务器,文件目录可以直接指定,怎么写呢?大神们?
c++如何解析ActionScript3.0用socket发送的图片ByteArray还原成图片?
ActionScript3.0用socket给c++发送了一个图片的二进制数组ByteArray,c++收到数据,但是怎么解析这个接收到的数据,从而把它还原成图片? 原谅菜鸟新人没有银子……
win7 raw socket 发送接收udp有时成功有时失败
在win7系统,使用raw socket分别编写发送和接收udp的程序。一开始可以成功,后来莫名其妙就接收不到。然后试过一次相同的代码可以接收成功,但过几个小时之后有接收不了。 以下是做的一些测试:(源地址和目的地址都是127.0.0.1) ①使用raw socket发送,wireshark可以捕获到,且数据、端口正确。但是raw socket编写的接收端和java编写的接收端接收不到 ②使用java的发送端发送,raw socket接收端可以接收 据测试应该是发送端问题,可是之前成功过,同一份代码却无端失败。所以猜测会不会是系统或其他的问题。
基于socket的文件传输
用MFC做的一个小的聊天工具,要实现一个文件传输的功能,但是用ios::binary打开文件后有些文件发送不了,只能够发送txt文本,不知道为什么会这样 debug的时候发现用来将要发送的文件内容读取的缓冲区里的内容是 无效的字符串 ,按道理来说用ios::binary打开的文件应该是统一的二进制流文件,但是为什么有些字符无法读到缓冲区(字符型数组)里呢?望大神能够指点一二 ``` char *sendData; //定义一个缓冲区来装载文件内容 while (true) //进入死循环 { sendData = new char[sendMsg_size]{ '\0' }; //为缓冲区分配空间并且初始化 send_file.read(sendData, sendMsg_size - 2); //使用read方法从文件中读取适当的内容,send_file是fstream的文件对象,已经和文件关联了 for (int i = sendMsg_size - 1;i > 0;i--) //这一个循环主要是将所有读入的内容向后移动一个位置,从而给缓冲区第一个位置空出来,然后用一个‘f’来表示这一段内容是一个文件的内容,因为这是一个聊天工具,所以想要用不同的消息的头来表示这个消息的性质 { sendData[i] = sendData[i - 1]; } sendData[0] = 'f'; iResult = send(Client_socket, sendData, strlen(sendData), 0); //send函数来发送装有文件内容的缓冲区 if (iResult == SOCKET_ERROR) { pointer->MessageBox(_T("发送失败!"), _T("错误"), MB_OK | MB_ICONERROR); delete[]sendData; return 0; } //异常处理 delete[]sendData; //这一轮发完之后就删除堆中的分配的空间 while (recvData[0] != 'o'); //从客户端那里要发过来一个特定的消息才能够进入下一步,这是为了让服务器发送文件的速度和客户端接受文件并且写入的速度相符合 recvData[0] = '\0'; //客户端接受好了后,服务器重置消息头 if (send_file.peek() == EOF) { break; } //如果读到文件尾的话就说明文件已经读完了,就可以跳出死循环了 } sendData = "e"; //发送一个特定的消息给客户端,告诉它已经发完了 send(Client_socket, sendData, strlen(sendData), 0); send_file.close(); //关闭文件 ```
C#中Socket发送文件。。
我用List<ArraySegment<byte>> buffers = new List<ArraySegment<byte>>(); 将两个数据放进去,然后再传到服务器,该怎么去接收呢。 List<ArraySegment<byte>> buffers = new List<ArraySegment<byte>>(2); client.BeginReceive(buffers, SocketFlags.None, new AsyncCallback(ReceiveMessage), client); 接收到的是一段合在一起的数据了,为什么会这样。怎么解决
socket套接字文件传输问题,非文本文档无法传输
Linux下使用套接字文件传输,只能传输文本文件,非文本文件读取时无法完全读入,读了很少一部分就停止读入了,求大神解决!
java socket 传文件文件接收后不能打开
java socket传文件,客户端将文件读取到byte[]中,然后用Map对相关内容进行包装之后输出到服务器端,但服务器端读取文件内容的循环除第一次读取的Map是客户端写入过来的内容外,从第二次循环开始Map的内容都跟第一次一样的,请问怎么回事? 服务器端代码: `public void run() { ObjectInputStream is = null; OutputStream os = null; byte cache[] = new byte[1024]; Map map = null; int len = 0; String fileName = null; int i = 0; try { is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); map = (Map)is.readObject(); fileName = "d:/" +(String)map.get("fn"); os = new BufferedOutputStream(new FileOutputStream(fileName)); //文件内容接收 while(true){ //map在第二次通过readObject方法读出后内容与第一次读取的值一样 map = (Map)is.readObject(); if(null==map){ continue; } if(((Boolean)map.get("fe"))){ break; } cache = (byte[])map.get("c"); if(null==cache || 0==cache.length){ continue; } len = (Integer)map.get("l"); os.write(cache,0,len); map = null; cache = null; } os.flush(); System.out.println("--->over"); } catch (IOException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); }finally { try{ if(null!=is){ is.close(); is = null; } if(null!=os){ os.close(); os = null; } if(null!=socket){ socket.close(); socket = null; } }catch (Exception e){ e.printStackTrace(); } } } 客户端代码: `public void actionPerformed(ActionEvent e) { Map map = null; Socket socket = null; ObjectOutputStream oos = null; InputStream is = null; byte cache[] = new byte[1024]; int len = 0; try { socket = new Socket("192.168.88.154",8888); socket.setSoTimeout(10*1000); socket.setKeepAlive(true); File file = new File(jTextField.getText()); is = new BufferedInputStream(new FileInputStream(file)); oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream())); //文件名称 map = new HashMap(); map.put("fn",file.getName()); map.put("fl",file.length()); map.put("fe",false); oos.writeObject(map); oos.flush(); //文件内容 while(true){ map.clear(); if((len=is.read(cache))<=0){ break; } map.put("c",cache); map.put("l", len); map.put("fe", false); oos.writeObject(map); } oos.flush(); //文件结束 map = new HashMap(); map.put("fe",true); oos.writeObject(map); oos.flush(); } catch (IOException e1) { e1.printStackTrace(); } finally { try{ if(null!=is){ is.close(); is = null; } if(null!=oos){ oos.close(); oos = null; } if(null!=socket){ socket.close(); socket = null; } }catch (Exception e1){ e1.printStackTrace(); } } }
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问