linux socket 端口问题 5C

主机IP: 192.168.1.14
公网:1.2.3.4
路由器映射到外网端口:8888

socket 
服务器bind    端口:1234 ,地址只能用 1.2.3.4:8888

外网的客户端 绑定地址 和 端口 分别应该是什么,

2个回答

外网客户端,tcp连接调用的connect函数中,传的绑定地址是1.2.3.4,端口8888
路由器会做ip和端口的内外网映射。

客户端主动连服务器端,客户端的端口和地址无所谓
服务器bind 端口:1234 ,那么就是把1234映射到8888上
注意你用的是udp还是tcp

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
linux socket 内外网通讯
我做了个socket 服务器,通过路由器映射到外网端口8888。。 我在外网要如何连接到该服务器。我用 公网ip + port 8888 connect失败。 求大神解答
PHP SOCKET如何释放所占用的端口
请问一下Linux上我用socket(在windows正常)但是每次都提醒占用端口 需要释放 所以我试了下在绑定前加上socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) 但是这样不但不行 而且客
Linux能否向同一服务器发起大于65535个socket
tcp端口号的范围从0到65535,理论上最多向同一服务器发起65535个socket对吧?如何突破这个限制,想在单台Linux上模拟10万个socket客户端,请问如何实现?
通过JAVA如何查看远程端口是否开启?(不使用SOCKET)
现在做的一个JAVAWEB项目要求加一个端口查看功能,本来用SOCKET测试很顺利, 但是上面不允许用SOCKET做,说是用了SOCKET远程的服务就会连通并往下走了, 然后我自己这面测试也确定有这样的情况,所以SOCKET方法就得PASS掉了,但是除 了SOCKET方面我也想不到别的方法了,用了APACHE的TELNET 但是到了CONNECT 的时候程序就卡住不往下走了…… 求高人指点了!!! 忘说了,是LINUX下…… 而且端口PING不了吧……
安卓与linux服务器进行socket通信错误:BrokenPipeError
我在linux上写了个python脚本,作为socket 服务器,安卓作为socket客户端,进行socket通信。linux的ip为192.168.80.100,socket端口为12345。 先启动socket服务器,再启动客户端,用客户端发送消息,服务器可以很好收到,但要对消息进行一段时间的处理,等到再发返回给客户端消息时,python就会出现: ``` BrokenPipeError: [Errno 32] Broken pipe ``` 这是安卓socket客户端代码: ``` import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.view.View.OnClickListener; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { private TextView result = null; private static final String HOST = "192.168.80.100"; private static final int PORT = 12345; private Socket socket = null; private BufferedReader bufferedReader = null; private PrintWriter printWriter = null; private String string = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText eturl= findViewById(R.id.eturl); Button btn= findViewById(R.id.btn); initSocket(); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String message; message = eturl.getText().toString(); if (socket.isConnected()){ if (!socket.isOutputShutdown()){ Toast.makeText(MainActivity.this,"正在发送,请稍等……",Toast.LENGTH_LONG).show(); sendMsg(message); } } } }); } protected void sendMsg(final String message){ new Thread(new Runnable() { @Override public void run() { if(socket.isConnected()){ if(!socket.isOutputShutdown()){ printWriter.println(message); } } } }).start(); } protected void initSocket(){ new Thread(new Runnable() { @Override public void run() { try{ socket=new Socket(HOST,PORT); bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); if(socket!=null){ if (socket.isConnected()) { if (!socket.isInputShutdown()) { if ((string = bufferedReader.readLine()) != null) { Log.i("TAG","++"+string); string+=""; handler.sendEmptyMessage(1); } else { //TODO } } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } public Handler handler; { handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { Log.i("TAG", "--" + msg); result.setText(new StringBuilder().append(result.getText().toString()).append(string).toString()); } } }; } } ``` 可能是安卓客户端在收到消息前已经关闭了socket,但要怎么解决呢,时间很急,求大神请教!不胜感激
刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗?
如果可以是不是可以用这样的流程,先socket()创建描述符, 然后再bind()绑定一个IP地址跟端口?
请问如何用linux套接字编程来发挥万兆网卡的性能?
双线程,一个生产数据放入kfifo,一个从kfifo取出数据,通过套接字发送。最终测试出来速度只能达到400MB/S。(kfifo出队64KB数据要100us) 之后我将生产者做了更改,让它只更新队首的in指针,不做数据拷贝,此时速度能达到1000MB/S。(kfifo出队64KB数据只要10us) 我怀疑是生产者生产数据写入队列时,导致消费者所在的cpu cache失效,然后cache未命中导致速度骤降。但是不知道怎么解决这个问题。 在网上搜索答案,但是没有找到类似情况。看到有一个和我问题应该比较类似的,但是没有找到解决方法。 《请问为何tcp send第一次时很慢, 第二次时很快呢?》 https://www.oschina.net/question/2897213_2193602 ```c #include "szg_common.h" #include "szg_kfifo.h" #include "szg_socket.h" /**kfifo * 队列是将linux内核中的kfifo移到了这里来用,用malloc来替代内核中的kmalloc * 此代码(发送端)运行在NXP T4240上,系统linux,万兆网卡。 * 接收端软件运行在PC上,系统windows10,万兆网卡。 * * 1.正常出入队,kfifo总大小64M 元素大小256bytes 期望出队和期望入队都是256个元素 * 速度400MB/S 出队64k要100us send要50us * 2.注释掉kfifoin中的两行memcpy(szgKfifoCopyIn中的),让其只更新队首in指针 * 速度1000MB/S 出队64k要10us send要50us * * */ #define KFIFO_SEND_SIZE 0x10000 //64k #define FIFO_IN 0x100 //每次入队时期望入队的元素个数:256个(即256*256 = 64k) #define FIFO_OUT 0x100 //每次出队时期望出队的元素个数:256个(即256*256 = 64k) #define FIFO_E_SIZE 0x100 //元素大小:256byte #define FIFO_SIZE 0x4000000 //总大小:64Mbyte (256*256*1024个) kfifo testkFifo; void *szgTestKfifoThread(void *param) { UINT32 ret; char data_buf[KFIFO_SEND_SIZE] = {0}; while(TRUE) { ret = szgKfifoIn(&testkFifo,data_buf,FIFO_IN); if(ret == 0) { pthread_yield(); //usleep(2); } } } int kfifo_test(void) { INT32 listenFd; INT32 connectFd; INT32 ret; UINT32 clientIp; pthread_t threadId; pthread_attr_t attr; struct timeval start,end; char send_buf[KFIFO_SEND_SIZE]; memset(send_buf,1,KFIFO_SEND_SIZE); signal(SIGPIPE,SIG_IGN); /** * 初始化kfifo * 总大小 64M * 元素大小 256byes * 元素个数 256*1024个 * 出队,入队都是期望256个元素,不到256个有多少出多少,实际个数作为返回值返回 */ ret = szgKfifoAlloc(&testFifo,FIFO_SIZE/FIFO_E_SIZE,FIFO_E_SIZE); CHECK_EXIT(ret == ERROR, "fifo init err!"); /*创建线程,线程分离*/ pthread_attr_init (&attr); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); if (0 != pthread_create(&threadId,&attr, (void *)szgTestKfifoThread,NULL)) { SZG_LOG(SZG_LOG_ERR,"Create Thread data_filter_thread Fail \n"); return ERROR; } /*服务器初始化 端口6101 发送缓存2M 接收缓存1M(2M/2)*/ listenFd = szgSockInit(NULL,6101,0x200000); CHECK_EXIT(listenFd < 0, "socket error"); while(TRUE) { printf("wait connect\n"); /*客户端ip通过&clientIp返回(其实下面没用到)*/ connectFd = szgSockAccept(listenFd,&clientIp); if (connectFd < 0) { SZG_LOG(SZG_LOG_ERR,"server Accept Failed!/n"); return 0; } while(TRUE) { //gettimeofday(&start,NULL); /*出队 256*256 */ ret = szgKfifoOut(&testkFifo,send_buf,FIFO_OUT); if(ret == 0)//没有数据 { pthread_yield(); continue; //usleep(2); } //gettimeofday(&end,NULL); //printf("kfifo time %lu us \n",(1000000*(end.tv_sec-start.tv_sec) + (end.tv_usec-start.tv_usec))); /*发送64k*/ //gettimeofday(&start,NULL); ret = szgSendData(connectFd,send_buf,ret*FIFO_E_SIZE); if(ret == ERROR) { SZG_LOG(SZG_LOG_ERR,"szgSendData data error\n"); break; } //gettimeofday(&end,NULL); //printf("send time %lu us \n",(1000000*(end.tv_sec-start.tv_sec) + (end.tv_usec-start.tv_usec))); } } return 0; } ```
Linux-ARM 连接网络摄像头,tcp封装http协议的问题
1.问题背景 有一块裁剪过的ARM板要用网线和网络摄像头直连,厂商只提供了CGI-API,没有其他接口,由于板子资源限制,也没法装http服务和curl。目前考虑用tcp 封装http 进行控制。 尝试过用Wireshark抓过浏览器和摄像头通信的包结构如下 ``` GET /cgi-bin/images_cgi?channel=0&user=admin&pwd=admin HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: 192.168.14.18 DNT: 1 Connection: Keep-Alive ``` 问题: 我把cookie删掉了,其余部分直接同过socket调试工具发给摄像头是有应的 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576047462_916583.png) 然后我tcp客户端也按照相同的格式send,但是始终没有收到摄像头的回应,是哪边的问题? tcp 客户端代码: ``` static protocol_err_t protocol_CameraCommand(PROTOCOL *this) { unsigned short port = 80; // 服务器的端口号 char *server_ip = "192.168.14.18"; // 服务器ip地址 int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建TCP套接字 if(sockfd < 0) { protocol_SendString(this,"socket failed\n"); return PROTOCOL_ERR_FAIL; } struct sockaddr_in server_addr; //定义服务器信息结构体 bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 主动连接服务器 if(err_log != 0) { sprintf(this->sendBuffer, "connect error: %s(errno: %d)\n",strerror(errno),errno); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_FAIL; } char str1[1024] = ""; sprintf(str1, "%s\r\n","GET /cgi-bin/date_cgi?action=get&user=admin&pwd=admin HTTP/1.0"); //服务端接收数据处理文件地址,并带参数 sprintf(str1, "%s%s\r\n",str1,"Accept: text/html, application/xhtml+xml, image/jxr, */*"); sprintf(str1, "%s%s\r\n",str1,"Accept-Language: zh-CN"); sprintf(str1, "%s%s\r\n",str1,"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"); sprintf(str1, "%s%s\r\n",str1,"Accept-Encoding: gzip, deflate"); sprintf(str1, "%s%s\r\n",str1,"Host: 192.168.14.18"); //服务器地址 sprintf(str1, "%s%s\r\n",str1,"Connection: Keep-Alive"); //sprintf(str1,"%s%s\r\n",str1,"Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F"); sprintf(str1, "%s\r\n",str1); protocol_SendString(this,"----------------------------- HTTP Data ----------------------------------\n\n"); sprintf(this->sendBuffer,"%s",str1); protocol_SendString(this, this->sendBuffer); sprintf(this->sendBuffer,"--------------------------- Data Len=%d ----------------------------------\n\n",strlen(str1)); protocol_SendString(this, this->sendBuffer); int ret=send(sockfd, str1, strlen(str1), 0); // 向服务器发送信息 if(ret<0) { protocol_SendString(this,"send"); close(sockfd); return PROTOCOL_ERR_FAIL; } protocol_SendString(this, "------------------------ server retrun data -------------------------------\n"); char recv_buf[1024*10240]=""; recv(sockfd, recv_buf, sizeof(recv_buf), 0); sprintf(this->sendBuffer,"%s\n\n",recv_buf); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_NONE; } ```
MAC 下端口复用为啥不起作用
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable)); MAC无论启用多线程还是多进程的端口复用,只有一个线程/进程处理数据,在linux下没问题,是MAC的限制吗?
Netty作为socket长链接,在windows部署占用38M左右内存,在linux部署占用1.5G左右内存
不知各位有遇到过这样问题的吗? ![图片说明](https://img-ask.csdn.net/upload/201910/19/1571456018_34605.png) 这是在linux部署直接就这样了 关于启动类我给大家粘一下代码 ``` Thread thread = new Thread(new Runnable() { @Override public void run() { //服务端要建立两个group,一个负责接收客户端的连接,一个负责处理数据传输 //连接处理group EventLoopGroup boss = new NioEventLoopGroup(); //事件处理group EventLoopGroup worker = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); // 绑定处理group bootstrap.group(boss, worker).channel(NioServerSocketChannel.class) //保持连接数 .option(ChannelOption.SO_BACKLOG, 100000) //有数据立即发送 .option(ChannelOption.TCP_NODELAY, true) //保持连接 .childOption(ChannelOption.SO_KEEPALIVE, true) //处理新连接 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel sc) throws Exception { // 增加任务处理 ChannelPipeline p = sc.pipeline(); p.addLast(new IdleStateHandler(new Integer(new ReadProperties().getUrlValue("read.time.seconds")),0,0)); p.addLast(new ServerIdleStateTrigger()); p.addLast(new Decoder()); p.addLast(new Encoder()); p.addLast(new ServerHandler()); } }).option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT).childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); //绑定端口,同步等待成功 ChannelFuture future; try { future = bootstrap.bind(serverPort).sync(); if (future.isSuccess()) { serverSocketChannel = (ServerSocketChannel) future.channel(); // System.out.println("服务端开启成功"); // 启动定时删除文件的线程 new Thread(new DeleteFile()).start(); } else { // System.out.println("服务端开启失败"); } //等待服务监听端口关闭,就是由于这里会将线程阻塞,导致无法发送信息,所以我这里开了线程 future.channel().closeFuture().sync(); } catch (Exception e) { // e.printStackTrace(); } finally { //优雅地退出,释放线程池资源 boss.shutdownGracefully(); worker.shutdownGracefully(); } } }); ``` handler类继承SimpleChannelInboundHandler
python关于套接字通信的问题,本地套接字无法connect到公网listen的端口
工作遇到一个套接字(内网)无法connect上一台公网服务器listen的端口 简化代码为 client:内网 ``` import socket conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) conn.connect(('打个码', 4444)) data = conn.recv(1024) print(data) conn.close() ``` server:公网 ``` import socket listen = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listen.bind(('0.0.0.0', 4444)) listen.listen(10) while 1: server = listen.accept() print(server[1]) server[0].send(bytes('123'.encode())) ``` client抛出异常: TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 测试两台公网,一台linux,一台windows,均抛出同样异常。 可以确定的是: 在本地测试server和client是能连通的。 我临时关闭linux的防火墙以及本机防火墙也是同样异常。 可ping通公网(我都拿shell连接了……),telnet指定其端口连接不可达。 抓包发现,只有本地发出了三个SYN包,没有来自公网服务器的应答包。(服务器的不敢乱装抓包工具啊,防火墙能让我临时关下已经不错了,亲) 真心感谢各位大佬解答。
为什么scoket连接云服务器的22端口能连通,但是连接自己定义的TCP:8888等等端口就连不通
腾讯云服务器 ubuntu系统。 服务器端socket为什么不能绑定公网IP地址。 文档上说是linux 默认将22端口暴露在公网上?这个暴露是什么意思?怎么暴露的
C#SOCKET长连接小数据程序未响应
最近由于业务的需要,Linux系统嵌入式设备往我做的服务程序发送数据。 速度奇慢,而且还是程序无响应。后来自己用C#写了一个客户端用来测试。已经用了线程池,不知道用法对不对。请大家帮忙看下。 服务端: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net; namespace consoleSocketServer { class Program { static int socketCount = 0; static Socket serverSocket; static Socket clientSocket; public static int clientcount = 0; public int clientnum = 0; static int listSQL = 0; static bool asy = true; public static Int32 portServer = 0; public static string ipServer = ""; public static Thread threadSocketListen; public static Thread threadDoWork; public static Thread threadInsert; public static int countsql = 0; static void Main(string[] args) { IPAddress ipAddress; portServer = 4660; serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ipAddress = IPAddress.Parse("192.168.33.29"); ipServer = ipAddress.ToString(); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, portServer); Console.WriteLine("服务器IP:" + ipServer + " 端口:" + portServer); serverSocket.Bind(localEndPoint); serverSocket.Listen(20); //设置线程池 ThreadPool.SetMaxThreads(4, 4); //开启新的线程监听 threadSocketListen = new Thread(SocketListen); threadSocketListen.Start(); Console.WriteLine("服务启动成功"); } static void SocketListen() { while (true) { //接受客户端信息 clientSocket = serverSocket.Accept(); //开启处理线程 ThreadPool.QueueUserWorkItem(new WaitCallback(doWork)); //threadDoWork = new Thread(new ThreadStart(doWork)); //threadDoWork.Start(); } } /// <summary> /// 处理方法 /// </summary> static void doWork(object a) { //获取客户端信息 IPEndPoint ipEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint; string address = ipEndPoint.Address.ToString(); //Console.WriteLine(address + ":连接成功"); //取消息 byte[] inBuffer = new byte[1024]; byte[] outBuffer = new byte[8]; string inBufferStr = ""; int rec = 0; StringBuilder sb = new StringBuilder(); while (true) { try { rec = clientSocket.Receive(inBuffer);//如果没有消息为空 阻塞 当前循环 //收到的长度不够 忽略此次数据 if (rec <= 8) { continue; } int ll = inBuffer[4] + inBuffer[5] * 255; inBufferStr = Encoding.UTF8.GetString(inBuffer, 8, ll); Console.WriteLine(inBufferStr); //回复收到 outBuffer[4] = 0; outBuffer[5] = 0; outBuffer[6] = 0; outBuffer[7] = 0; outBuffer[3] = 0; outBuffer[2] = 0; outBuffer[1] = 0; outBuffer[0] = 1; clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None); socketCount++; Console.WriteLine(socketCount.ToString()); //break; } catch (SocketException es) { //clientSocket.Close(); return; } } } } } 客户端: using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace SocketClient { class Program { static Socket clientSocket; static void Main(string[] args) { try { //将网络端点表示为IP地址和端口 用于socket侦听时绑定 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.33.29"), 4660); clientSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); //将Socket连接到服务器 clientSocket.Connect(ipep); string outBufferStr; //发送消息 outBufferStr = "123456789qwe|789654123|1|2015-04-22 10:51:34|6|test1|test2| "; byte[] tempb = Encoding.UTF8.GetBytes(outBufferStr); byte[] outBuffer = new byte[tempb.Length + 8]; //加功能和长度 outBuffer[0] = 1; outBuffer[1] = 0; outBuffer[2] = 0; outBuffer[3] = 0; outBuffer[4] = Convert.ToByte(tempb.Length % 255); outBuffer[5] = Convert.ToByte(tempb.Length / 255); outBuffer[6] = 0; outBuffer[7] = 0; for (int i = 0; i < tempb.Length; i++) { outBuffer[8 + i] = tempb[i]; } // Byte[] inBuffer = new Byte[1024]; int kkk = 0; while (kkk <= 10000) { clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None); kkk++; Thread.Sleep(1); Console.WriteLine(kkk.ToString()); //Console.WriteLine("服务器响应:"); //接收服务器端信息 //clientSocket.Receive(inBuffer, 1024, SocketFlags.None); //Console.WriteLine(Encoding.ASCII.GetString(inBuffer)); } Console.WriteLine(kkk.ToString()); Console.ReadLine(); } catch (Exception exp) { Console.WriteLine(exp.Message); Console.ReadLine(); } } } } 客户端收到数据,显示出来,在回发一个byte[] 1 0 0 0 0 0 0 0 用于确认收到。 实际上目前客户端没有对服务端收到的数据做处理,因为那样又要多开一个线程。 但是现在问题就是这样简单的测试发送10000条数据,居然会卡死,很纳闷。我前几天见他们Linux自己写的程序发送1W条数据,就是2 3秒的时间。请大神指导。难道C#真的是不能做服务端的程序?
Linux下网络编程read,write问题(C语言),求大神指点阿!!!
zuijzuj。最近学习socket编程的时候调试代码出现了一些问题,求大神们指导阿!!!我要实现的功能是客户端输入两个操作数和一个运算符,在服务端进行运算再把结果返回到客户端。现在的bug是客户端输入第一个操作数的时候没问题,输入运算符的时候客户端可以通过write函数写入但是服务端读出的结果不是输入的运算符,客户端输入第二个操作数的时候write函数无法写入,这是缓冲区满了吗?缓冲区大小不是由内核自己决定的吗?还是write和read函数调用不当?请大神们指正!这个问题困扰了我好多天了! 以下是客户端和服务端的代码,末尾是运行结果的截图。 客户端: #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> #include <errno.h> int main() { int cfd; /* 文件描述符 */ int recbytes; int sin_size; char result[1024]={0}; /* 接受缓冲区 */ struct sockaddr_in s_add,c_add; /* 存储服务端和本端的ip、端口等信息结构体 */ unsigned short portnum=2015; /* 服务端使用的通信端口,可以更改,需和服务端相同 */ int opnum1,opnum2; char op[2]; char opnum1s[3],opnum2s[3],temp[3]; char mutex[3] = "111"; printf("Hello,welcome to client !\r\n"); /* 建立socket 使用因特网,TCP流传输 */ cfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == cfd) { printf("socket fail ! \r\n"); return -1; } printf("socket ok !\r\n"); /* 构造服务器端的ip和端口信息,具体结构体可以查资料 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family=AF_INET; s_add.sin_addr.s_addr= inet_addr("192.168.1.104"); /* ip转换为4字节整形,使用时需要根据服务端ip进行更改 */ s_add.sin_port=htons(portnum); printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port); /* 这里打印出的是小端 和我们平时看到的是相反的。 */ /* 客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小 */ if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) { printf("connect fail !\r\n"); return -1; } printf("connect ok !\r\n"); /*连接成功*/ //write op and opnumbers to server //write opnumber1 printf("Please enter the first number:"); scanf("%d", &opnum1); itoa(opnum1, opnum1s, 10);//itoa if (-1 == write (cfd, opnum1s,strlen(opnum1s))) { printf("write first number fail!\n"); return 0; } //write op printf("Please enter the op('+','-','*','/'): "); scanf("%s", &op); if (-1 == write (cfd, op ,strlen(op))) { printf("write op fail!\n"); return 0; } //write opnumber2 printf("Please enter the second number:"); scanf("%d", &opnum2); itoa(opnum2, opnum2s, 10); if (-1 == write (cfd, opnum2, strlen(opnum2s))) { printf("write second number fail!\n"); return 0; } else { printf("All has been writed!\n"); } //从服务端接收字符*/ if(-1 == (recbytes = read(cfd,result,5))) { printf("read data fail !\r\n"); return -1; } else printf("read ok\r\nREC:\r\n"); result[recbytes]='\0'; printf("The result is %s\r\n",result); getchar(); /* 此句为使程序暂停在此处,可以使用netstat查看当前的连接 */ close(cfd); /* 关闭连接,本次通信完成 */ return 0; } void itoa(int i,char*string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } ``` 服务端: #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> int main() { int sfp,nfp; /* 定义两个描述符 */ struct sockaddr_in s_add,c_add; int sin_size; unsigned short portnum=2015; /* 服务端使用端口 */ int res, opnum1, opnum2, opnumi; int i = 1; int opnum[3]; char op[2],ress; char opnums[3],opnumis[3],opnum1s[3],opnum2s[3],temp[3]; printf("Hello,welcome to my server !\r\n"); sfp = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sfp) { printf("socket fail ! \r\n"); return -1; } printf("socket ok !\r\n"); /* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family=AF_INET; s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */ s_add.sin_port=htons(portnum); /* 使用bind进行绑定端口 */ if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) { printf("bind fail !\r\n"); return -1; } printf("bind ok !\r\n"); /* 开始监听相应的端口 */ if(-1 == listen(sfp,5)) { printf("listen fail !\r\n"); return -1; } printf("listen ok!\r\n"); while(1) { sin_size = sizeof(struct sockaddr_in); /* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处, 不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。 此处accept的第二个参数用于获取客户端的端口和地址信息。 */ nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size); if(-1 == nfp) { printf("accept fail !\r\n"); return -1; } printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port)); //read from client while (i <= 4) { if (4 == i) { switch (op[1]) { case '+': res = opnum[1] + opnum[3];break; case '-': res = opnum[1] - opnum[3];break; case '*':res = opnum[1] * opnum[3];break; case '/': res = opnum[1] / opnum[3];break; default : printf("op error!\n"); } itoa(res, ress, 10); if(-1 == write(nfp,ress,strlen(ress))) { printf("write fail!\r\n"); return -1; } printf("write ok!\r\n"); } else { switch(i) { case 2: if ( -1 == read(nfp, op, 1)) { printf("read op fail!\n"); } printf("read op is:%d\n", op);break; case 1: case 3: if ( -1 == read(nfp, temp, 3)) { printf("read %d number fail!\n", i); } printf("read opnum%d is:%s\n", i ,temp); opnum[i] = atoi(temp);break; default : printf("error!\n"); } } i ++; } close(nfp); } close(sfp); return 0; } void itoa(int i,char*string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } ``` 客户端运行的情况: Hello,welcome to client ! socket ok ! s_addr = 0x6801a8c0 ,port : 0xdf07 connect ok ! Please enter the first number:123 Please enter the op('+','-','*','/'): + Please enter the second number:444 write second number fail! ![图片说明](https://img-ask.csdn.net/upload/201506/16/1434438899_561887.png) 服务端运行的情况: Hello,welcome to my server ! socket ok ! bind ok ! listen ok! accept ok! Server start get connect from 0xc0a80168 : 0xc42d read opnum1 is:123 read op is:-1074087721 read opnum3 is:123 op error! 段错误 (核心已转储) ![图片说明](https://img-ask.csdn.net/upload/201506/16/1434438921_326746.png)
如何使用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)); 发送数据同样包含链路层头
linux udp协议 FPGA连接
目前程序运行在LINUX系统上,与别的产品交联,我这边就是标准的udp接收数据的程序 socket打开,配置端口和协议,bind后recv数据,我的IP是192.168.0.2, 对方的IP是192.168.0.3 对方先上电,我的后上电udp收不到他发送的数据,但是他重启或者(我crtl+c退出然后,ping一下他)在运行程序就能通了。。。。对方说我这边要用C语言做一遍ARP协议的ping操作,然后就能通信了。。。。有没有linux网络的大神教教我啊。。。。O(∩_∩)O谢谢
java nio的select和linux的epoll有什么区别?
#### 最近在看关于epoll和select相关问题,但是并没有发现java的select和linux的epoll有什么区别 #### java的nio select代码如下 ``` import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.UUID; public class NioServer { private static Map<String, SocketChannel> clientMap = new HashMap<>(); public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); ServerSocket serverSocket = serverSocketChannel.socket(); serverSocket.bind(new InetSocketAddress(8899)); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { try { /** * 程序会卡在select()函数,当客户端有动作了,比如连接上了,或者是发送消息过来了,服务端才会继续走 * 当第一个客户端连接上并且是selectionKey.isAcceptable(),代码就又重新卡到了select()函数上 * 等待客户端的再次操作(无论是哪个客户端) */ selector.select(); /** * selector.selectedKeys()这段代码可以从中知道是哪个客户端,执行了什么操作 * */ Set<SelectionKey> selectionKeys = selector.selectedKeys(); selectionKeys.forEach((selectionKey) -> { final SocketChannel client; try { if (selectionKey.isAcceptable()) { ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel(); /** * 这代代码获取了真正的客户端socket句柄 */ client = server.accept(); client.configureBlocking(false); /** * 这句话如果不写,就相当于没有注册当消息可读时的回调函数,当客户端发送消息过来的时候 * 服务端的selector.selectedKeys()就永远不会受到这类消息 */ client.register(selector, SelectionKey.OP_READ); String key = "[" + UUID.randomUUID().toString() + "]"; clientMap.put(key, client); } else if (selectionKey.isReadable()) { client = (SocketChannel) selectionKey.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); int count = client.read(readBuffer); if (count > 0) { readBuffer.flip(); Charset charset = Charset.forName("utf-8"); String recvMsg = String.valueOf(charset.decode(readBuffer).array()); System.out.println(client + ":" + recvMsg); String sendKey = null; for (Map.Entry<String, SocketChannel> stringSocketChannelEntry : clientMap.entrySet()) { if (stringSocketChannelEntry.getValue() == client) { sendKey = stringSocketChannelEntry.getKey(); break; } } for (Map.Entry<String, SocketChannel> stringSocketChannelEntry : clientMap.entrySet()) { SocketChannel socketChannel = stringSocketChannelEntry.getValue(); ByteBuffer writeBuffer = ByteBuffer.allocate(1024); writeBuffer.put((sendKey + ": " + recvMsg).getBytes()); writeBuffer.flip(); socketChannel.write(writeBuffer); } } } } catch (Exception ex) { ex.printStackTrace(); } }); selectionKeys.clear(); } catch (Exception e) { e.printStackTrace(); } } } } ``` #### linux的epoll的c代码如下 ``` #include <iostream> #include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <cstring> using namespace std; #define MAXLINE 5 #define OPEN_MAX 100 #define LISTENQ 20 #define SERV_PORT 5000 #define INFTIM 1000 void setnonblocking(int sock) { int opts; opts=fcntl(sock,F_GETFL); if(opts<0) { perror("fcntl(sock,GETFL)"); exit(1); } opts = opts|O_NONBLOCK; if(fcntl(sock,F_SETFL,opts)<0) { perror("fcntl(sock,SETFL,opts)"); exit(1); } } int main(int argc, char* argv[]) { int i, maxi, listenfd, connfd, sockfd,epfd,nfds, portnumber; ssize_t n; char line[MAXLINE]; socklen_t clilen; if ( 2 == argc ) { if( (portnumber = atoi(argv[1])) < 0 ) { fprintf(stderr,"Usage:%s portnumber/a/n",argv[0]); return 1; } } else { fprintf(stderr,"Usage:%s portnumber/a/n",argv[0]); return 1; } //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件 struct epoll_event ev,events[20]; //生成用于处理accept的epoll专用的文件描述符 //创建一个epoll文件描述符 epfd=epoll_create(256); struct sockaddr_in clientaddr; struct sockaddr_in serveraddr; listenfd = socket(AF_INET, SOCK_STREAM, 0); //把socket设置为非阻塞方式 //setnonblocking(listenfd); //设置与要处理的事件相关的文件描述符 ev.data.fd=listenfd; //设置要处理的事件类型 ev.events=EPOLLIN|EPOLLET; //ev.events=EPOLLIN; //注册epoll事件,将socket文件描述符listenfd的ev事件注册到epoll上 epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev); memset(&serveraddr, sizeof(serveraddr) ,0); serveraddr.sin_family = AF_INET; char *local_addr="127.0.0.1"; inet_aton(local_addr,&(serveraddr.sin_addr));//htons(portnumber); serveraddr.sin_port=htons(portnumber); //先bind再监听 bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr)); listen(listenfd, LISTENQ); maxi = 0; for ( ; ; ) { //等待epoll事件的发生 //param epfd表示将监听epfd的事件 //param events表示容器,一旦有事件发生,events数组会被填充 nfds=epoll_wait(epfd,events,20,500); //处理所发生的所有事件 for(i=0;i<nfds;++i) { if(events[i].data.fd==listenfd)//如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。 { connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen); if(connfd<0){ perror("connfd<0"); exit(1); } //setnonblocking(connfd); char *str = inet_ntoa(clientaddr.sin_addr); cout << "accapt a connection from " << str << endl; //设置用于读操作的文件描述符 ev.data.fd=connfd; //设置用于注测的读操作事件 ev.events=EPOLLIN|EPOLLET; //ev.events=EPOLLIN; //注册ev epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev); } else if(events[i].events&EPOLLIN)//如果是已经连接的用户,并且收到数据,那么进行读入。 { cout << "EPOLLIN" << endl; if ( (sockfd = events[i].data.fd) < 0) continue; if ( (n = read(sockfd, line, MAXLINE)) < 0) { if (errno == ECONNRESET) { close(sockfd); events[i].data.fd = -1; } else std::cout<<"readline error"<<std::endl; } else if (n == 0) { close(sockfd); events[i].data.fd = -1; } line[n] = '/0'; cout << "read " << line << endl; //设置用于写操作的文件描述符 ev.data.fd=sockfd; //设置用于注测的写操作事件 ev.events=EPOLLOUT|EPOLLET; //修改sockfd上要处理的事件为EPOLLOUT //epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev); } else if(events[i].events&EPOLLOUT) // 如果有数据发送 { sockfd = events[i].data.fd; write(sockfd, line, n); //设置用于读操作的文件描述符 ev.data.fd=sockfd; //设置用于注测的读操作事件 ev.events=EPOLLIN|EPOLLET; //修改sockfd上要处理的事件为EPOLIN epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev); } } } return 0; } ``` #### 从上面两段代码看好像基本思想都是一样的,并没有传说中的select不知道发生的事件,只能通过循环去判断的情况。 #### 但是后来我又在网上找了一段linux的select实现的网络io代码 ``` #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<stdlib.h> #include<errno.h> #include<arpa/inet.h> #include<netinet/in.h> #include<string.h> #include<signal.h> #define MAXLINE 1024 #define LISTENLEN 10 #define SERV_PORT 6666 int main(int argc, char **argv) { int i, maxi, maxfd, listenfd, connfd, sockfd; int nready, client[FD_SETSIZE]; ssize_t n; fd_set rset, allset; char buf[MAXLINE]; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr)); listen(listenfd, LISTENLEN); maxfd = listenfd; /* initialize */ maxi = -1; /* index into client[] array */ for (i = 0; i < FD_SETSIZE; i++) client[i] = -1; /* -1 indicates available entry */ FD_ZERO(&allset); FD_SET(listenfd, &allset); for ( ; ; ) { rset = allset; /* structure assignment */ nready = select(maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) /* new client connection */ { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr*) &cliaddr, &clilen); #ifdef NOTDEF printf("new client: %s, port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL), ntohs(cliaddr.sin_port)); #endif for (i = 0; i < FD_SETSIZE; i++) if (client[i] < 0) { client[i] = connfd; /* save descriptor */ break; } if (i == FD_SETSIZE) { printf("too many clients"); exit(0); } FD_SET(connfd, &allset); /* add new descriptor to set */ if (connfd > maxfd) maxfd = connfd; /* for select */ if (i > maxi) maxi = i; /* max index in client[] array */ if (--nready <= 0) continue; /* no more readable descriptors */ } for (i = 0; i <= maxi; i++) /* check all clients for data */ { if ( (sockfd = client[i]) < 0) continue; if (FD_ISSET(sockfd, &rset)) { if ( (n = read(sockfd, buf, MAXLINE)) == 0)/* connection closed by client */ { close(sockfd); FD_CLR(sockfd, &allset); client[i] = -1; } else write(sockfd, buf, n); if (--nready <= 0) break; /* no more readable descriptors */ } } } } ``` #### 从这段代码里面确实是可以看出是通过循环判断的,我的问题是java的select是不是就是linux的epoll的思想?
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
五年程序员记流水账式的自白。
不知觉已中码龄已突破五年,一路走来从起初铁憨憨到现在的十九线程序员,一路成长,虽然不能成为高工,但是也能挡下一面,从15年很火的android开始入坑,走过java、.Net、QT,目前仍处于android和.net交替开发中。 毕业到现在一共就职过两家公司,目前是第二家,公司算是半个创业公司,所以基本上都会身兼多职。比如不光要写代码,还要写软著、软著评测、线上线下客户对接需求收集...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
一文详尽系列之模型评估指标
点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://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) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
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那么牛的一个东...
还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!!
去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利。时隔一年的今天,阿里云正式发布了 Visual Studio Code 版本,全面覆盖前端开发者,帮助前端实现一键打包部署,让开发提速 8 倍。 VSCode 版本的插件,目前能做到什么? 安装插件之后,开发者可以立即体验...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
2019年除夕夜的有感而发
天气:小雨(加小雪) 温度:3摄氏度 空气:严重污染(399) 风向:北风 风力:微风 现在是除夕夜晚上十点钟,再有两个小时就要新的一年了; 首先要说的是我没患病,至少现在是没有患病;但是心情确像患了病一样沉重; 现在这个时刻应该大部分家庭都在看春晚吧,或许一家人团团圆圆的坐在一起,或许因为某些特殊原因而不能团圆;但不管是身在何处,身处什么境地,我都想对每一个人说一句:新年快乐! 不知道csdn这...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了掌握好Android打下基础。
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
相关热词 c# 为空 判断 委托 c#记事本颜色 c# 系统默认声音 js中调用c#方法参数 c#引入dll文件报错 c#根据名称实例化 c#从邮件服务器获取邮件 c# 保存文件夹 c#代码打包引用 c# 压缩效率
立即提问