C/C++ socket tcp 发送和接收数据问题

客户端和服务器之间发送的一个数据正常,但当发送第二个数据后便出现了问题。求大神帮忙看一哈:
代码如下:
client端:
#include
#include
#include
using namespace std;
#pragma comment(lib,"ws2_32.lib")

int main(int argc, char* argv[])
{

WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
if(WSAStartup(sockVersion, &data) != 0)
{
return 0;
}

SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sclient == INVALID_SOCKET)
{
    printf("invalid socket !");
    return 0;
}

sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(1000);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
/****************************************
int WSA_return;
WSADATA WSAData;
WSA_return=WSAStartup(0x0101,&WSAData);

hostent *host_entry;// 结构指针 
char host_name[256] ="manage.dgjgw.cn";

if(WSA_return==0)
{

    host_entry=gethostbyname(host_name);// 即要解析的域名或主机名 
    printf("%s\n", host_name);
    if(host_entry!=0)
    {
        printf("解析ip地址: ");
        printf("%s",inet_ntoa(*((struct in_addr*)host_entry->h_addr)));

    }

}
serAddr.sin_addr.S_un.S_addr = inet_addr((char*)inet_ntoa(*((struct in_addr*)host_entry->h_addr)));
****************************************/

//接收缓存区
int nRecvBuf=32*1024;//设置为32K
setsockopt(sclient,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(sclient,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

printf("连接中》》》》》》》》》\n");
//连接1
if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
    printf("connect error !\n");
    closesocket(sclient);
    return 0;
}
else
{
    printf(" connect success !\n");
}
//连接2

while (true)
{  
    char sendData[10] ={0x05,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33};
    char sendData1[2] ={0x05,0x03};
    cout<<"请输入指令"<<endl;
    int a=0;
    cin>>a;
    switch(a)
    {
    case 1:
        printf("发送注册消息\n");
        send(sclient, sendData, strlen(sendData), 0);
        break;      
    case 2:
        printf("发送心跳消息\n");
        send(sclient, sendData1, strlen(sendData1), 0);
        break;
    default : 
        cout<<"输入错误"<<endl; 
        break;
    }
    char recData[2];
    memset(recData,0,2);
    int ret=0;
    ret = recv(sclient, recData, 2, 0);
    if(ret > 0)
    {
        printf("信息发送成功,回执如下\n");
        for(int i=0;i<=ret;i++)
        {
            printf("%x",recData[i]);
        }
        printf("\n");
    }
    else
    {
        printf("信息发送失败,关闭客户端\n");
        break;
    }
memset(recData,0,2);
closesocket(sclient);
}
system("pause");
closesocket(sclient);
WSACleanup();
return 0;

}
sever端:
//#include "stdafx.h"
#include
#include

#pragma comment(lib,"ws2_32.lib")

int main(int argc, char* argv[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(sockVersion, &wsaData)!=0)
{
return 0;
}

//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(slisten == INVALID_SOCKET)
{
    printf("socket error !");
    return 0;
}

//绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(1000);
sin.sin_addr.S_un.S_addr = INADDR_ANY; 
if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
    printf("bind error !");
}      

//开始监听
if(listen(slisten, 5) == SOCKET_ERROR)
{
    printf("listen error !");
    return 0;
}

//循环接收数据
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
char revData[255]; 
while (true)
{
    printf("等待连接...\n");
    sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
    if(sClient == INVALID_SOCKET)
    {
        printf("accept error !");
        continue;
    }
    printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
    //接收数据
    char revData[10];
    memset(revData,0,10);
    int ret= recv(sClient, revData, 10, 0);
    if(ret > 0)
    {   
        printf("消息接收成功:\n");
        for(int i=0;i<ret;i++)
        {   
            printf("%x",revData[i]);
        }
        printf("\n");
    }
    else
    {
      printf("消息接收失败:\n");
    }
    while(revData[0]==0x05&&revData[1]==0x01&&revData[2]==0x33&&revData[3]==0x33&&revData[4]==0x33
        &&revData[5]==0x33&&revData[6]==0x33&&revData[7]==0x33&&revData[8]==0x33&&revData[9]==0x33)
    {
        printf("注册消息接收成功:\n");
        for(int i=0;i<ret;i++)
        {   
            printf("%x",revData[i]);
        }
        printf("\n");
        char sendData1[2];
        sendData1[0]=0x05;
        sendData1[1]=0x02;
        send(sClient, sendData1, 2, 0);
        break;
    }
    while(revData[0]==0x05&&revData[1]==0x03)
    {
        printf("心跳消息接收成功:\n");
        for(int i=0;i<2;i++)
        {
            printf("%x",revData[i]);
        }
        printf("\n");
        char sendData[2];
        sendData[0]=0x05;
        sendData[1]=0x04;
        send(sClient, sendData, 2, 0);
        break;

    }

}
closesocket(sClient);
closesocket(slisten);
WSACleanup();
return 0;
}

2个回答

第二次发送出现什么问题?发送乱码还是发送失败或者其他?

对,我觉的楼主还是首先需要把问题定义清楚,弄清楚到底那里出现了这样的问题

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C/C++ socket tcp 发送和接收数据问题

客户端和服务器之间发送的一个数据正常,但当发送第二个数据后便出现了问题。求大神帮忙看一哈: 代码如下: client端: #include <WINSOCK2.H> #include <STDIO.H> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0) { return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sclient == INVALID_SOCKET) { printf("invalid socket !"); return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(1000); serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); /**************************************** int WSA_return; WSADATA WSAData; WSA_return=WSAStartup(0x0101,&WSAData); hostent *host_entry;// 结构指针 char host_name[256] ="manage.dgjgw.cn"; if(WSA_return==0) { host_entry=gethostbyname(host_name);// 即要解析的域名或主机名 printf("%s\n", host_name); if(host_entry!=0) { printf("解析ip地址: "); printf("%s",inet_ntoa(*((struct in_addr*)host_entry->h_addr))); } } serAddr.sin_addr.S_un.S_addr = inet_addr((char*)inet_ntoa(*((struct in_addr*)host_entry->h_addr))); ****************************************/ //接收缓存区 int nRecvBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)); //发送缓冲区 int nSendBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int)); printf("连接中》》》》》》》》》\n"); //连接1 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connect error !\n"); closesocket(sclient); return 0; } else { printf(" connect success !\n"); } //连接2 while (true) { char sendData[10] ={0x05,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33}; char sendData1[2] ={0x05,0x03}; cout<<"请输入指令"<<endl; int a=0; cin>>a; switch(a) { case 1: printf("发送注册消息\n"); send(sclient, sendData, strlen(sendData), 0); break; case 2: printf("发送心跳消息\n"); send(sclient, sendData1, strlen(sendData1), 0); break; default : cout<<"输入错误"<<endl; break; } char recData[2]; memset(recData,0,2); int ret=0; ret = recv(sclient, recData, 2, 0); if(ret > 0) { printf("信息发送成功,回执如下\n"); for(int i=0;i<=ret;i++) { printf("%x",recData[i]); } printf("\n"); } else { printf("信息发送失败,关闭客户端\n"); break; } memset(recData,0,2); closesocket(sclient); } system("pause"); closesocket(sclient); WSACleanup(); return 0; } sever端: //#include "stdafx.h" #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { //初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(sockVersion, &wsaData)!=0) { return 0; } //创建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(slisten == INVALID_SOCKET) { printf("socket error !"); return 0; } //绑定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(1000); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("bind error !"); } //开始监听 if(listen(slisten, 5) == SOCKET_ERROR) { printf("listen error !"); return 0; } //循环接收数据 SOCKET sClient; sockaddr_in remoteAddr; int nAddrlen = sizeof(remoteAddr); char revData[255]; while (true) { printf("等待连接...\n"); sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); if(sClient == INVALID_SOCKET) { printf("accept error !"); continue; } printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); //接收数据 char revData[10]; memset(revData,0,10); int ret= recv(sClient, revData, 10, 0); if(ret > 0) { printf("消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); } else { printf("消息接收失败:\n"); } while(revData[0]==0x05&&revData[1]==0x01&&revData[2]==0x33&&revData[3]==0x33&&revData[4]==0x33 &&revData[5]==0x33&&revData[6]==0x33&&revData[7]==0x33&&revData[8]==0x33&&revData[9]==0x33) { printf("注册消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); char sendData1[2]; sendData1[0]=0x05; sendData1[1]=0x02; send(sClient, sendData1, 2, 0); break; } while(revData[0]==0x05&&revData[1]==0x03) { printf("心跳消息接收成功:\n"); for(int i=0;i<2;i++) { printf("%x",revData[i]); } printf("\n"); char sendData[2]; sendData[0]=0x05; sendData[1]=0x04; send(sClient, sendData, 2, 0); break; } } closesocket(sClient); closesocket(slisten); WSACleanup(); return 0; }

linux c socket tcp客户端只能发送一次,发送第二次服务端接收不到,必须重启才行

服务端循环accept,如果每次客户端只发送一次请求,就没问题, 但是如果客户端循环发送数据,服务端就接收不到一次连接中的第二次请求。 下面贴代码,求解这个问题到底咋回事 服务端 sock_serv.c #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <unistd.h> #include <errno.h> #include <arpa/inet.h> #define BACKLOG 10 #define RECVBUF_SIZE 4096 #define PORT 20000 int init_server(int type){ int sockfd; if ((sockfd = socket(AF_INET, type, 0)) == -1){ printf("create socker error\n"); return -1; } struct sockaddr_in addrv4; bzero(&addrv4, sizeof(addrv4)); addrv4.sin_family = AF_INET; addrv4.sin_port = htons(PORT); addrv4.sin_addr.s_addr = INADDR_ANY; if (bind(sockfd, (struct sockaddr *)&addrv4, sizeof(addrv4)) < 0){ printf ("bind sockfd error\n"); return -1; } if (listen(sockfd, BACKLOG) < 0){ printf ("listen sockfd error\n"); return -1; } return sockfd; } int main(void){ int sockfd, newfd; if ((sockfd = init_server(SOCK_STREAM)) == -1){ printf ("server init failed\n"); exit(1); } while (1) { struct sockaddr client_addr; bzero(&client_addr, sizeof(client_addr)); socklen_t len = sizeof(client_addr); char recvbuf[RECVBUF_SIZE]; if ((newfd = accept(sockfd, &client_addr, &len)) < 0){ printf("%s\n", strerror(errno)); printf ("accept request error\n"); exit(1); } printf(" the client fd is :%d\n", newfd); printf ("client ip is %s", inet_ntoa(((struct sockaddr_in *)&client_addr)->sin_addr)); ssize_t ret; if ((ret = recv(newfd, recvbuf, RECVBUF_SIZE, 0)) < 0){ printf("%s\n", strerror(errno)); printf("recv data error \n"); exit(1); } if (ret == 0) { printf("always read to EOF\n"); } printf("the client request data is :\n\t\t%s", recvbuf); char *resp_data = "the server was recvived success!"; if (send(newfd, resp_data, strlen(resp_data), 0) == -1){ printf("response data error\n"); exit(1); } //shutdown(newfd, SHUT_RDWR); //close(newfd); if (strcmp(recvbuf, "exit") == 0){ shutdown(sockfd, SHUT_RDWR); close(sockfd); } } } ``` ``` 客户端 sock_client.c #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #define BUFSIZE 4096 #define PORT 20000 void error(const char *str){ printf("%s\n" "the error info is : %s\n", str, strerror(errno)); } int init_client(){ int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ error("socket error"); return -1; } struct sockaddr_in addrv4; bzero(&addrv4, sizeof(addrv4)); addrv4.sin_family = AF_INET; addrv4.sin_port = htons(PORT); addrv4.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(sockfd, (struct sockaddr *)&addrv4, (socklen_t) sizeof(addrv4)) == -1){ error("connect error"); return -1; } return sockfd; } int main(void){ char consolebuf[BUFSIZE]; char recvbuf[BUFSIZE]; int sockfd, len, recvlen; if ((sockfd = init_client()) == -1){ error("init client error"); exit(1); } while (1){ printf("input >>"); if ((len = read(STDIN_FILENO, &consolebuf, BUFSIZE)) == -1){ error("read data error"); exit(1); } if (strcmp(consolebuf, "exit-client") == 0){ break; } if (send(sockfd, consolebuf, len, 0) == -1){ error("send data error"); exit(1); } if ((recvlen = recv(sockfd, recvbuf, BUFSIZE, 0)) == -1){ error("receive the server response error\n"); exit(1); } write(STDOUT_FILENO, recvbuf, recvlen); } shutdown(sockfd, SHUT_RDWR); close(sockfd); exit(0); } ``` ```

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; } } ```

socket TCP连接接收端分帧的问题

Client端的程序是不可改变的,然后针对这个Client端写一个Server端的程序,Client端和Server器采用的是TCP连接,Client端发送好几条报文给Server端,Server端这边调用Recv函数接收报文变成了一条,而不是一条一条接收?怎么让服务器端接收的报文也是和发送时一样变成多条。程序是Windows平台VC编写。

C语言 socket 如何发送带指针的结构体?

发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出。 但是接收的时候,怎么接收到结构体中?thanks!

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); } 问题出现在写入完成后末尾出现连续的^@^@^@^@^@^@^@^@符号,占用空间

[新手]关于socket.io接收tcp服务器数据后转发给客户端的问题【一句话就能解决?】

如标题,接收到了tcp服务器的数据后,想转发给客户端。但是socket.io文档似乎没有这种方法。直接上代码。 服务器部分: **var express=require('express'); var app=express(); var fs =require('fs'); var net=require('net'); var http=require('http').createServer(app); var io=require('socket.io').listen(http); //nodeServer需要的变量 var nodeServer = new net.Socket(); var ExBuffer = require('./ExBuffer'); var len = 4027; var offset=4; var exBuffer = new ExBuffer().uint32Head().littleEndian(); var sbuf = new Buffer(4); //存储客户端的连接实例 var aSocket={}; app.use(express.static('public')); app.get('/',function(req,res){ res.sendfile(__dirname+'/index.html'); }); //连接到C服务器 nodeServer.connect(3102, '127.0.0.1', function() { console.log('CONNECTED TO: 127.0.0.1:3102' ); // 建立连接后立即向服务器发送数据,服务器将收到这些数据 nodeServer.write('your socket has connected'); }); var server = http.listen(8888, '127.0.0.1',function () { var host = server.address().address var port = server.address().port console.log("welcome to http://%s:%s", host, port) }); // 同客户端建立连接 io.sockets.on('connection', function (socketIO) { aSocket=socketIO; // 从客户端接收数据,然后发送至Tomcat socketIO.emit("test","your websocket has connected"); socketIO.on('fromWebClient', function (webClientData) { }); //客户端断开连接 socketIO.on('disconnect', function () { console.log('DISCONNECTED FROM CLIENT'); }); }); // 从C服务器接收数据 nodeServer.on('data', function (data) { if(data.readUInt8(0)==170){ sbuf.writeUInt32LE(len,0);//写入包长 exBuffer.put(sbuf); exBuffer.put(data); } else{ exBuffer.put(data); } console.log('nodeServer'+data.length); }); //当nodeServer收到完整的数据包时 exBuffer.on('data', function(buffer) { console.log('>> nodeServer receive data.length:'+buffer.length); //console.log(buffer); //console.log(buffer.readInt32LE(826)); var useData=byteArrayUntil.getUseJson(buffer,offset); console.log(aSocket); aSocket.emit['pushToWebClient',useData.hz]; }); // 为nodeServer添加“data”事件处理函数 // data是服务器发回的数据 // 为客户端添加“close”事件处理函数 nodeServer.on('close', function() { console.log('Connection closed'); }); //构造一个遍历函数,分别返回array或者json var byteArrayUntil=new function(){ this.getUseData=function(data,offset){ var arr=[]; for(var i=0;i<=799;i++){ arr.push(data.readInt32LE(826+i*offset)); } return arr; } this.getUseJson=function(data,offset){ var arr=[]; for(var i=0;i<=500;i++){ arr.push(data.readInt32LE(826+i*offset)); } return {'hz':arr}; } }();** 客户端部分:(很多无用的就贴关键的了,其实这个可以暂时无视) <script> var socket = io.connect(); socket.on("test", function (data) { console.log(data); }); socket.on('pushToWebClient', function (data) { console.log(data); }); 现在问题就是服务器的这一部分: exBuffer.on('data', function(buffer) { console.log('>> nodeServer receive data.length:'+buffer.length); //console.log(buffer); //console.log(buffer.readInt32LE(826)); var useData=byteArrayUntil.getUseJson(buffer,offset); console.log(aSocket); aSocket.emit['pushToWebClient',useData.hz]; }); 我把数据接收到了,最后一句转发给客户端不会。ps:不用管对应id问题,我只需要简单实现转发数据即可。 参考过这个文档(如果知道上面怎么处理可以不用继续看了): var http = require('http'), 2 net = require('net'), 3 app = http.createServer().listen('8181'), 4 io = require('socket.io').listen(app), 5 nodeServer = new net.Socket(); 6 // 连接到Tomcat 7 nodeServer.connect(8007, '127.0.0.1', function() { 8 console.log('CONNECTED'); 9 }); 10 // 存储客户端的WebSocket连接实例 11 var aSocket = {}; 12 // 同客户端建立连接 13 io.sockets.on('connection', function (socketIO) { 14 // 从客户端接收数据,然后发送至Tomcat 15 socketIO.on('fromWebClient', function (webClientData) { 16 // 存储至映射表 17 aSocket[socketIO.id] = socketIO; 18 // 发送至Tomcat的数据中添加socket_id 19 webClientData['sid'] = socketIO.id; 20 // 发送String类型的数据至Tomcat 21 nodeServer.write(JSON.stringify(webClientData)); 22 }); 23 // 客户端断开连接 24 socketIO.on('disconnect', function () { 25 console.log('DISCONNECTED FROM CLIENT'); 26 }); 27 }); 28 29 // 从Tomcat接收数据 30 nodeServer.on('data', function (data) { 31 var jsonData = JSON.parse(data.toString()); 32 // 分发数据至客户端 33 for (var i in jsonData.list) { 34 aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data); 35 } 36 }); 有这么一句 aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data); 虽然它实现的是通过id来实现建立一一对应连接,但是它还是独立出来使用了(查了一些资料都是在一起用的), 到底该怎么实现呢?ps:不用管对应id问题,我只需要简单实现转发数据即可。 求大神帮助。

Linux C语言, 如何获取socket接收缓冲区中当前数据的大小

由于程序中的一个任务处理较耗时,需要采样socket的接收缓冲区的大小 来决定是否跳出当前任务去读取socket中的数据

C语言 socket 编写简单服务端客户端通信问题

大家好,感谢你的回复。 我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 Talk is cheak , show me the code. 服务端代码: ```#include<stdio.h> #include<stdlib.h> #include<WinSock2.h> #pragma comment(lib,"ws2_32.lib") int main(){ WSADATA wsd; SOCKET sockServer; SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号 SOCKET sockClient; SOCKADDR_IN clientaddr; WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口 sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket if (sockServer != -1 && sockServer != INVALID_SOCKET){ printf("Socket has been created :%d", sockServer); } else{ printf("Socket create failed."); exit(0); } serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(6000);//绑定端口6000 int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR)); char recvBuf[100]; int len = sizeof(SOCKADDR); listen(sockServer, 5);//5为等待连接数 while (1){ sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len); //接收客户端数据 recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); printf("to me:%s\n",recvBuf); memset(recvBuf, 0, 100); } closesocket(sockClient); system("pause"); return 0; } ``` 客户端代码: ``` #include<winsock2.h> #include<stdio.h> #pragma comment(lib, "ws2_32.lib") void main() { WSADATA wsaData; SOCKET sockClient;//客户端Socket SOCKADDR_IN addrServer;//服务端地址 WSAStartup(MAKEWORD(2, 2), &wsaData); char message[20] = "HelloSocket!"; //定义要连接的服务端地址 addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址) addrServer.sin_family = AF_INET; addrServer.sin_port = htons(6000);//连接端口6000 //新建客户端socket sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int s = 0; s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); while (1){ //发送数据 int a = send(sockClient, message, strlen(message) + 1, 0); printf("to server:"); scanf("%s", message); } //关闭socket closesocket(sockClient); WSACleanup(); } ``` 求懂的高手来解答一下。 谢谢了!

C# socket networkstream 接收数据

最近在做c/s,客户端用C#的Socket进行通信。接收数据开单独的接收线程使用networkstream进行接收 接收的方法大体上跟网上流传的一样 do { int readSize = mNetworkstream.Read(bytes, 0, 1024); if (readSize > 0) { //do sth } }while(mNetworkstream.DataAvailable) 这样接收局内网或者单机没问题,但是放到外网测试网络不稳定就接收不全。 搜集很多资料,也试过在发送Socket包之前加个包大小,然后在while中增加判断是否读到包的大小,可是一样接不全,中间好像掺杂了一些没用的数据? 我一个包很容易超过byte[10240],而且要整个包接收完才能处理数据。 请问C# Socket使用networkstream怎样才能接收完全呢? ps:也有听说过异步networkstream.beginread接收。鉴于网上一大抄,各种人贴各种代码片段根本就没用。有些有用但只能接收一次。。。 如果有beginread相关代码也希望大牛们贴出来参考一下,不要贴代码片段。。。 谢谢了~

如何使用raw_socket处理tcp包,并且不被内核协议栈干扰

##现象: 当我使用raw_socket 进行tcp包处理时,服务端接收到 SYN请求时,立即回复了RST。 ##原因: raw_socket 接收到的SYN包,linux 协议栈同样会接收到,然而内核协议栈 会立刻回复RST,因为内核协议栈,检测到SYN目的端口无人监听。 ##问1: 是否有方法让内核不处理,或接收不到此SYN? ##问2: 链路层raw_socket在发送ip包时,如何获取目的mac。(不想自己维护arp,是否有获取系统arp表的接口?) ##我使用的socket: ###创建rawsocket: fd = socket(**PF_PACKET**,**SOCK_RAW**, htons(ETH_P_ALL)); 创建链路层rawsocket ###从rawsocket接收数据 |mac|ip|tcp|data| recvfrom(fd, data, len, 0, (struct sockaddr*)&sa, sizeof(sa)); 接收数据包含链路层头 ###使用rawsocket发送数据 |mac|ip|tcp|data| sendto(fd, data, len, 0, (struct sockaddr*)&sa, sizeof(sa)); 发送数据同样包含链路层头

WINDOWS C SOCKET编程 recv()接收不到数据?

我的代码逻辑(C语言实现断点续传的demo)大概是 > 服务器将文件分片,每次向客户端只发送一个分片,只有等客户端返回应答才继续发送接下来的分片 现在我遇到的问题是 > 客户端发送的应答,能发送到套接字的输出缓冲区,可是,服务器这边却recv()不到这个应答 我想不到是什么原因,help me 代码 ``` //服务器 //保存上次下载标识 int id; //从tfp指向的文件即Temp.txt读取内容,默认为0,即从第一个片开始 id = fgetc(tfp); int idsize = sizeof(id); //需要一个接收客户端应答的缓冲区 char buffer[BUF_SIZE] = { 0 }; char *bp = buffer; printf("Server will send files to the client\n\n\n\n"); int recvLen = 0,sendLen=0; for ( i = 0; i < PIECE; i++) { //记录当前下载到哪一个片,保存到Temp.txt fputc(i, tfp); printf("the %d of for circle\n", i); //上次下载到哪里,这一次便从那里开始 if (sli[i].grade == id) { //每次发送一个分片 printf("\tserver will send the %d piece of the file\n",i+1); if ((sendLen = send(sock, dp[i], tsize, 0)) < 0) { printf("\tsend a mess to client had failed, and the successful bytes is:%d\n", sendLen); } else { printf("\tsend a mess to client was succeeded, and the successful bytes is:%d\n", sendLen); } /* *服务器每发送一个分片,必须根据客户端的应答进行判断 *1、客户端应答已收到(用字符'f'表示)——继续发送剩下的分片,并且显示传输进度 *2、客户端应答未收到(用字符'n'表示)——保存当前下载标识,结束传输 */ //recv()的作用是阻塞,因为要接收客户端的应答 printf("\t\twait to receive respond from client\n"); if ((recvLen = recv(sock, buffer, nCount, 0)) > 0) { printf("\tthe num to recv respond from client is %d,and the nCount is %d\n", i + 1, recvLen); } else { printf("receive respond failed! return:%d\n",recvLen); } //应答超时设置为6s,表示经过了6s以后,若客户端还没有应答,就不再等待该应答 //Sleep(6000); if (*bp=='f') { //若客户端已收到应答 //表示已发送完毕一个分片,下载标识+1,并且打印传输进度 printf("Server gets the respond from client\n"); printf("\tthe rate of transported procession now is:%d%%\n", i * 100 / PIECE); if (i % 10 == 0) printf("\n"); id++; } else if(*bp=='n') { //若客户端收不到应答 //也就是当前分片也发送失败,即当前下载标识不需要自增1——记录当前下载标识 printf("Server misses the respond from client\n"); fputc(i, tfp); break; } else { printf("nothing\n"); } if (id == PIECE) printf("\n传输完成!\n"); printf("\n"); } } ``` 客户端代码 ``` //客户端 /* *接收缓冲区是连续接受数据的 * 每次接收一个片就返回应答 * 同时写进文件(buffer->rfp) */ char buffer[BUF_SIZE] = { 0 }; //客户端用指向字符常量的指针来表示应答 char idNarr[2] = "n"; char idFarr[2] = "f"; const char *ip = idNarr; //该应答标识的实际长度 int len = sizeof(ip) / sizeof(const char *); //实际接收字节 int rLen = 0, i,nCount,fwLen; printf("\n\n\n\n"); for (i = 0; i < PIECE; i++) { printf("the %d of for circle\n",i); rLen = recv(clntSock, buffer, BUF_SIZE, 0); buffer[rLen] = '\0'; //检验是否从套接字的输入缓冲区接收到数据 printf("receive from server is %s,the length is %d\n",buffer,rLen); printf("ip point to the string is:%s\n",ip); //接收到数据就把应答标识标志为f ip =idFarr; printf("ip point to the string is:%s\n",ip); //发送应答标识,并检查是否发送成功 if ((nCount= send(clntSock, ip, len, 0))<0) { printf("send a mess to server had failed, and the successful bytes is:%d", nCount); } else { printf("send a mess to server was succeeded, and the successful bytes is:%d\n", nCount); } ip = idNarr; //将接收到的数据写入本地文件,并检查是否写入成功 if((fwLen = fwrite(buffer, 1, rLen, fp)) > 0) { printf("\tto write something into file of %d,and the nCount is %d\n", i + 1, rLen); } else { printf("fwrite failed!\n"); } } ```

发送端TCP的发送缓存设置为10K, 接收端接收缓存设置为10K,接收端一直不调用RECV去接收,那么发送端到底能发送出多少数据?

1. 编写TCP server和Client程序 2. server端在accept之前调用setsockopt(slisten, SOL_SOCKET, SO_RCVBUF,(char*)&uiRcvBuf, uiRcvBufLen);将接收缓存设置为10K. 3. cleint端在bind之前调用setsockopt(slisten, SOL_SOCKET, SO_SNDBUF,(char*)&uiSendBuf, uiSendBufLen);将发送缓存设置为10K 4. cleint端调用send函数发送,相关代码如下: ``` int n = 50; char sendData[1024]; int len = sizeof(sendData); printf("sendlen = %u",len); for (int i = 0;i < len; i++) { sendData[i] = 0x01; } while (n) { int iResult = send(sclient, sendData, len, 0 ); if (iResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); getchar(); closesocket(sclient); WSACleanup(); return 1; } n--; printf("Bytes Sent: %d,%d\n", iResult,50-n); } ``` 5. server端不调用recv函数接收 7. wireshark抓包显示如下: ![图片说明](https://img-ask.csdn.net/upload/201912/19/1576743174_639138.jpg) 8. cleint测试端发送了30k数据后停住了(send是阻塞式) **疑问:** 1. wireshark图中为什么在第一个红色框图的时候win才开始变化(win从10240变成7736)?这之前的数据是存在哪里的?不是接收缓存?不应该从接收第一个包开始就开始减少吗? 2. wireshark图中第一个红色框图为什么会有大于20k的数据(ack=21049)? 3. 为什么从wireshark看到server接收了20k多的数据,而不是10k? 4. cleint端为什么能够send出30k数据才停下来?

qt5.5 tcp服务器中文乱码

![图片说明](https://img-ask.csdn.net/upload/201605/25/1464149653_313929.jpg) 如图 我client发送部分代码是: void Widget::send() { QString ss="hello server你好,服务器!!!"; tcpSocket->write(ss.toStdString().c_str(),strlen(ss.toStdString().c_str())); //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); //tcpSocket->write(ss.toUtf8()); // QString ss="hello server - 你好,服务器!!!"; // QByteArray dateSend = ss.toLocal8Bit(); // tcpSocket->write(dateSend); } server端接收: void Widget::dataReceived() { while(m_pSocket->bytesAvailable()) { QByteArray vTemp; //vTemp = vTemp.to vTemp = m_pSocket->readAll(); // QTextCodec *codeTransfor = QTextCodec::codecForName("GBK"); // QString vTempStr = codeTransfor->toUnicode(vTemp);//.mid(2)); QString vTempStr = QTextCodec::codecForName("GBK")->toUnicode(vTemp); QString vFinalStr = QTextCodec::codecForName("UTF-8")->fromUnicode(vTempStr); // QString vTempStr = QString::fromLocal8Bit(vTemp); //QString vTempStr(vTemp); //QString vTempStr = tr(vTemp.data()); m_pEdt_Info->append(vFinalStr); } }

c++与java通信(socket TCP)c++用的默认的编码,java用的UTF-8 怎么解决中文乱码问题

c++代码如下,谁可以试着尝试一下,谢谢 #include <WINSOCK2.H> #include <stdio.h> #include <Windows.h> #pragma comment(lib,"ws2_32.lib") void main() { //创建套接字 WORD myVersionRequest; WSADATA wsaData; myVersionRequest=MAKEWORD(1,1); int err; err=WSAStartup(myVersionRequest,&wsaData);//协议库版本信息 if (!err) { printf("已打开套接字\n"); } else { //进一步绑定套接字 printf("嵌套字未打开!"); return; } //1.服务端:构造监听SOCKET,流式SOCKET 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(6001);//绑定端口 bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成 listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数 ////////////////////////////////////////////////////////////////////////// //开始进行监听 ////////////////////////////////////////////////////////////////////////// SOCKADDR_IN clientsocket; int len=sizeof(SOCKADDR); // while (1) // { SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听 char sendBuf[100]; sprintf(sendBuf,"welcome to 北京");//找对对应的IP并且将这行字打印到那里 //printf("%s",sendBuf);//打印出来显示正确 send(serConn,sendBuf,strlen(sendBuf)+1,0); char receiveBuf[100];//接 recv(serConn,receiveBuf,strlen(receiveBuf)+1,0); printf("%s\n",receiveBuf); closesocket(serConn);//关闭 WSACleanup();//释放资源的操作 //} }

Socket关闭后,如何清理输出缓冲区来阻止已经在输出缓冲区中的数据发送?

实践发现,当使用socketChannel.close()之后,对于close之前已经写入缓冲区但由于网络原因没有发送成功的数据,在server端网络恢复后,还是能接收到该数据; 求问是否有什么办法能在调用Close之前,将此socketChannel的输出缓冲区中的数据清理掉? 从该博主处得到的:http://blog.csdn.net/Ctrl_qun/article/details/52454380 这些I/O缓冲区特性可整理如下: I/O缓冲区在每个TCP套接字中单独存在; I/O缓冲区在创建套接字时自动生成; 即使关闭套接字也会继续传送输出缓冲区中遗留的数据; 关闭套接字将丢失输入缓冲区中的数据。

C#socket黑窗口发送消息,接收后会出现很多a

![图片说明](https://img-ask.csdn.net/upload/201908/30/1567169772_678410.png) //服务端 Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint point = new IPEndPoint(IPAddress.Parse("127.21.24.35"), 1324); soc.Bind(point); soc.Listen(2);//最大连接数 Console.WriteLine("等待客户端连接"); Socket tcp = soc.Accept(); Console.WriteLine("客户端已连接"); Console.WriteLine(tcp.RemoteEndPoint.ToString()); byte[] data = new byte[1024]; int length = tcp.Receive(data); string str = Encoding.UTF8.GetString(data); Console.WriteLine("接收的数据为:" + str); Console.ReadKey(); ``` //客户端 Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint ed = new IPEndPoint(IPAddress.Parse("127.21.24.35"), 1324); soc.Connect(ed); byte[] data = Encoding.UTF8.GetBytes("难啊是整的难啊"); soc.Send(data); Console.ReadKey(); ``` ``` `` `![图片说明](https://img-ask.csdn.net/upload/201908/30/1567162405_999134.png) C#socket黑窗口发送消息,接收后会出现很多a

两个ServerSocket在运行,分别监听两个不同的端口,接收数据出错

现在有两个ServerSocket在运行,分别监听两个不同的端口 ServerSocket server1=new ServerSocket(9000); ServerSocket server2=new ServerSocket(9010); 服务器监听客户端请求,每来一个Socket请求,将Socket绑定到一个随机端口进行处理,然后进行监听。两个端口都accept到请求后,接收数据出错。 试问:接收数据出错,接收到的数据与发送的数据不符?不是编码问题,接收一次数据后,前半部分数据出错,后半部分数据是对的

java的socket编程问题:为什么客户端接收服务器的数据时会有空白数据项?

例如:03-17 07:02:00.330 1984-2007/? I/info﹕ client buff --> 0/20160316//早餐/123.0 03-17 07:02:00.340 1984-2007/? I/info﹕ insert expend_table 03-17 07:02:00.340 1984-2007/? I/info﹕ client buff --> 03-17 07:02:00.340 1984-2007/? I/info﹕ client buff --> 0/20160316//午餐/22.0 03-17 07:02:00.340 1984-2007/? I/info﹕ insert expend_table 03-17 07:02:00.340 1984-2007/? I/info﹕ client buff --> 03-17 07:02:00.340 1984-2007/? I/info﹕ client buff --> 0/20160316/22ss/服装/123.0 数据内容忽视。client buff是客户端接受到的数据 就是为什么会是一条有数据一条没有数据这样循环下去? 服务端代码: pw = new PrintWriter(s.getOutputStream()); Cursor c = dbManager.query(Constant.DATA_TABLE,"username=?",new String[]{username}); while (c.moveToNext()){ // client端发送数据的顺序: isIncome + "/" + date + "/" + title + "/" + content + "/" + money String title = c.getString(c.getColumnIndex("title")); String money = c.getString(c.getColumnIndex("money")); Long date = c.getLong(c.getColumnIndex("date")); String isIncome = c.getString(c.getColumnIndex("isIncome")); String content = c.getString(c.getColumnIndex("content")); String data = isIncome + "/" + date + "/" + title + "/" + content + "/" + money + '\n'; pw.println(data); pw.flush(); } String endFlag = username + "/end" + '\n'; pw.println(endFlag); pw.flush(); 客户端代码: br = new BufferedReader(new InputStreamReader(s.getInputStream())); String buff; while (!(buff = br.readLine()).endsWith(mUsername + "/end")) { // server端发送数据的顺序: isIncome + "/" + date + "/" + title + "/" + content + "/" + money String[] str = buff.split("/"); if (str.length == 5) { //确保接收的数据正确 ContentValues values = new ContentValues(); values.put("isIncome", str[0]); values.put("date", Long.valueOf(str[1])); values.put("title", str[2]); values.put("content", str[3]); values.put("money", str[4]); if ("0".equals(str[0])) { if (!dbManager.insert(Constant.EXPEND_TABLE, values)) { flag = false; break; } } else if ("1".equals(str[0])) { if (!dbManager.insert(Constant.INCOME_TABLE, values)) { flag = false; break; } } } } db.setTransactionSuccessful(); db.endTransaction();

服务器socket接收并显示16进制的数据

发送指令A1 58 01 02 05 01 01 02 02 01 03 86 客户端会恢复消息,用网络调试助手显示是A1 58 01 02 05 01 01 02 02 01 00 03 请问应该怎么写?

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java校招入职华为,半年后我跑路了

何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

@程序员:GitHub这个项目快薅羊毛

今天下午在朋友圈看到很多人都在发github的羊毛,一时没明白是怎么回事。 后来上百度搜索了一下,原来真有这回事,毕竟资源主义的羊毛不少啊,1000刀刷爆了朋友圈!不知道你们的朋友圈有没有看到类似的消息。 这到底是啥情况? 微软开发者平台GitHub 的一个区块链项目 Handshake ,搞了一个招募新会员的活动,面向GitHub 上前 25万名开发者派送 4,246.99 HNS币,大约价...

再不跳槽,应届毕业生拿的都比我多了!

跳槽几乎是每个人职业生涯的一部分,很多HR说“三年两跳”已经是一个跳槽频繁与否的阈值了,可为什么市面上有很多程序员不到一年就跳槽呢?他们不担心影响履历吗? PayScale之前发布的**《员工最短任期公司排行榜》中,两家码农大厂Amazon和Google**,以1年和1.1年的员工任期中位数分列第二、第四名。 PayScale:员工最短任期公司排行榜 意外的是,任期中位数极小的这两家公司,薪资...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

华为初面+综合面试(Java技术面)附上面试题

华为面试整体流程大致分为笔试,性格测试,面试,综合面试,回学校等结果。笔试来说,华为的难度较中等,选择题难度和网易腾讯差不多。最后的代码题,相比下来就简单很多,一共3道题目,前2题很容易就AC,题目已经记不太清楚,不过难度确实不大。最后一题最后提交的代码过了75%的样例,一直没有发现剩下的25%可能存在什么坑。 笔试部分太久远,我就不怎么回忆了。直接将面试。 面试 如果说腾讯的面试是挥金如土...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

立即提问
相关内容推荐