记录服务器端ip,记录这个ip第一次启动文件的时间,并且排除重复的ip

error_reporting(0); //抑制所有错误信息
@header("content-Type: text/html; charset=utf-8"); //语言强制

//获取用户IP地址
$ip = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$ip = ($ip) ? $ip : $_SERVER["REMOTE_ADDR"];
logResult($ip);

echo sprintf("你的IP地址是:%s",$ip);

function logResult($word='') {
    $fp = fopen("log.txt","a");
    flock($fp, LOCK_EX) ;
    fwrite($fp,"记录时间:".strftime("%Y%m%d%H%M%S",time()).",IP:".$word."\n");
    flock($fp, LOCK_UN);
    fclose($fp);
}?>

上面是记录访问者的ip并且写入log文本,目前我想实现记录服务器端ip而不是访客ip,然后记录这个ip第一次访问这段php文件的时间,并且排除里面重复的ip。怎么改写呢

多台服务器用这个代码,希望记录哪些服务器访问了这个文件

3个回答

因为客户端是通过浏览器直接请求的,并不通过你所谓的“服务器”,所以,不存在服务器的地址。你有两个办法,一个是
用_SERVER["HTTP_HOST"] 得到访问你这个PHP所请求的主机名,然后你自己维护一个域名到IP的列表,查表获得。
一个办法是,使用$_SERVER['HTTP_REFERER']获得用户请求这个地址之前的网页的地址,据此判断他是从哪个服务器跳转来了。得到了referer后,然后得到对应的域名,再解析出对应的IP。

不太明白意思,你是说你有很多台服务器,希望记录哪个服务器被访问这个文件吗?如果是这个,应该用gethostbyname($_SERVER["SERVER_NAME"]) 这个获取当前服务器ip,然后记录到日志里就可以了吧

 $sreferer = $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : $ _SERVER["HTTP_HOST"];
$ip = gethostbyname(parse_url($sreferer)['host']);
$contents = file_get_contents("log.txt"); 
if ( strpos($contents, $ip) == false ) //如果没有ip
{
logResult($ip); //记录
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
公司SVN服务器,网络IP段修改后SVN就无法进行连接了

公司之前的IP地址为192.168.1.1 的,后来修改为192.168.10.1 。 修改完之后SVN服务器就无法进行连接了。已连接SVN就提示:由于连接方在一段时间后没有正确答复或连接的主机没有反应,链接尝试失败。 在没有安装过SVN的电脑上 装同样的SVN又是可以的。 已经试过清除SVN内的缓存了 还是不行。 之前自己以为重新卸载安装就可以了,但是试过之后发现 卸载安装后第一次打开是可以的 但是过一段时间后 还是会报错。

文件被别人随意调用,想提供给指定的人使用,非指定的人可以使用7天,不知道怎么实现

我有个php文件被人调用了,但是我只想给指定的几个服务器端IP永久使用 其他没有指定的一切服务器端IP,每个都只能调用7天,超过7天自动跳转到我的网页。 比如我想给服务器IP地址123.123.123和456.456.456使用, 但是有特别多的服务器IP在调用我这个文件, 从这些域名第一次使用开始记录他们的域名和首次调用时间, 在记录的首次调用时间7天之后, 他们再次使用就会跳转到798.com这个域名 / 求详细代码!!! / 求详细代码!!! 万分感谢

java socket得到服务器端多次返回的数据

[code="java"] import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; public class SocketSend { public static void main(String[] args) { String ip = "192.168.8.180"; int port = 8080; try { Socket socket = new Socket(ip, port); OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); String line = "aaa"; bw.write(line); bw.flush(); System.out.println("发送:"+line); BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); if ((line = br.readLine()) != null) { sb.append(line); } System.out.println("返回:"+sb.toString()); br.close(); bw.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } [/code] 正常情况下 服务器会分三次返回 111 222 333 但是我的程序只能接受到111,怎么才能接收到 222 和 333呢 ?

tcp协议问题,请大神指导

服务器使用tcp协议给客户端发送了3092字节的数据,我在客户端使用一个3092字节的结构体进行接收,为什么有时候一次性接收的 不到3092字节,也就是需要分两次接收才能接收完整,比如第一次接收2000,第二次再接收1092字节,按照ip分包,MTU=1500,超过1500字节他就会在ip层分包,但是他会在接收端组包,再交付给上一层,所以按道理不会出现这种问题,有哪一位大神能指导一下么?万分感激。。。

java socket服务端多次发送请求的问题

具体的是这样的: 需要往一个给定ip和端口的服务端发送数据,假如服务端收到数据并返回“success”之后,那么就不再重复发送数据。如果socket连接超时或者服务端返回的信息不是"success",那么就每多几秒再次发送数据。时间例如是:5s,10s,20s,35s.... 最笨的办法是每次都启动一个socket线程处理,可以在一个线程中解决这个问题吗?具体怎么设计,请大神 帮忙指导。

qt tcp服务端应该怎样正确关闭,我反复开关tcp的服务端,客户端连接后,会出现程序异常

服务器第一次开启(RUN)的时候,客户端端连接上来是没有问题的。然后我关闭(STOP)服务器,再开启,客户端连接上来,就会程序异常。 我在处理有新连接的信号的槽函数里(即v_SlotConnection)做了打印,当第二次开启服务器,客户端连接上会两次进入v_SlotConnection,然后就程序异常了。bug解决了,是因为我把newConnection放在开始的按钮里,放出来就没问题了,原因不明白。 ``` //开始运行tcp服务端 if((ui->buttonrun->text())=="RUN") { qDebug()<<"RUN"; //监听网卡下所有8087 if(false == tcpServer->isListening()) { tcpServer->listen(QHostAddress::Any, 8087); } //监听固定ip下 8087 // tcpServer->listen(QHostAddress(ipAddr), serverPort); ui->buttonrun->setText("STOP"); } else if((ui->buttonrun->text())=="STOP") { qDebug()<<"stop"; ui->linkNumber->display(0); ui->buttonrun->setText("RUN"); //主动和客户端端口断开 if(NULL == tcpSocket) { //清空计数 tcpServer->close(); } else { //倒着断开加入链表的ip地址 int i=clients.length()-1; qDebug()<<i<<"clients.length()"<<clients.length(); while(i>=0) { clients.at(i)->disconnectFromHost(); i--; } tcpServer->close(); } } connect(tcpServer, &QTcpServer::newConnection, this, &ServerWidget::v_SlotConnection); ```

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

Python 服务器设置问题

问题: 1. 从我的电脑ping服务器能成功,但是客户端发送信息服务器接收不到, 同样的客户端代码拿到服务器上服务器端是能接收到的,求教怎么处理。 我已经把服务器端的防火墙放开了python.exe应用程序的接入。 2. 服务器端在UDP协议下,进入while循环,第一次能在recvfrom()处停住等待, 接收信息后,如果处理,如果进入“该用户已在列表中”的话就会继续循环,但如果 进入“新用户登入”的话在再次进入while循环的recvfrom循环的话就会卡死,求教!PS:该问题如果我把两个东西都放到win10家庭版下,设置客户端尝试连接的ip为:127.0.0.1的时候就不会出现这个问题。 环境: 1. 服务器端:阿里云服务器win10Server操作系统,python2.7.13Shell进行测试, 已绑定固定ip:116.62.149.45 2. 客户端:win10家庭版,python2.7.13,没做内网映射,内网ip:192.168.1.102 这是在服务器端测试的截图 ![图片说明](https://img-ask.csdn.net/upload/201705/30/1496084750_144895.jpg) ![图片说明](https://img-ask.csdn.net/upload/201705/30/1496084760_587243.jpg) 相关代码: ``` 客户端代码: user='Wxs' title='E-Quoter' ip='116.62.149.45' port=random.randint(5000,25000) Serverport=12319 ################################################################################ # 聊天客户端主程序 def chatroommain(): global flag if pingInternet(): print 'Internet connecting success...' try: tryping() if flag==0: print 'Connect with Server success...' try: roomUI() print 'Chatroom is success...' except: print '\nError:Chatroom is faild!' except: print '\nError:Ping Server is faild!' else: print '\nError:Please check your Internet is online!' def roomUI(): global flag if flag==0: app=wx.App() chatroom=Chatroom(None) chatroom.Show() app.MainLoop() del app ######################################################################################### # 服务器注册 def pingInternet():# 客户端联网测试 ip='www.baidu.com' cmd='ping %s'%ip backinfo=os.system(cmd) if backinfo: return False else: return True def stopThreads():# 关闭线程 try: socket.close() except: pass def tryping():# 尝试连接服务器 global Flag,flag Flag=0 flag=0 try: socket=connectServer() time=timemannager() try: socket.start() try: if Flag==0: time.start() time.join() if flag==1: print 'Error:Connect with Server is Faild!' try: stopThreads() print 'Threads closing success...' except: flag=1 Flag=1 print 'Error:Threads closing Faild!' except: Flag=1 flag=1 print 'Error:Timemannager start faild!' except: Flag=1 flag=1 print 'Error:Socket Threads start faild!' except: flag=1 Flag=1 pass if flag==1: return False class connectServer(threading.Thread):# 创建连接线程 def __init__(self): threading.Thread.__init__(self) self.threadName='connectServer' self.exitFlag=threading.Event() def run(self): global Flag,user,ip,port,flag,Serverport try: sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0',port)) print 'Socket is ready...' try: hostname = socket.gethostname() hostip=socket.gethostbyname(hostname) msg='pingServer#'+str(user) sock.sendto(msg,('172.16.173.52',Serverport)) print 'ping msg has been sent...' Flag=0 while Flag==0: flag=1 print 'Waiting for pingback...' data,addr=sock.recvfrom(1024) print 'here' if data=='0': Flag=1 flag=1 print 'Error:Has the same name online!' elif data=='1': Flag=1 flag=0 print 'Connect with Server is ready...' elif data==None: Flag=1 flag=1 print 'Connect with Server is faild!' time.sleep(0.2) except: flag=1 print 'Error:Sent ping msg is faild!' except: flag=1 print 'Error:Socket is faild to prepare!' def close(): sock.close() class timemannager(threading.Thread):# 超时判定线程 def __init__(self): threading.Thread.__init__(self) self.threadName='timemannager' self.exitFlag=threading.Event() def run(self): global Flag,flag time.sleep(3) Flag=1 def close(): stop.close() 服务器端代码: class sock(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.threadName='recive' self.exitFlag=threading.Event() def run(self): global port,Flag,file_output,clientipdic,flag,clientportdic try: sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0',port)) print '\nReciving thread is ready...' try: while Flag==0: print '\nWaiting for new message...' data,addr=sock.recvfrom(3096) msg=data clientip=addr[0] clientport=addr[1] try: check=msg[:msg.index('#')] name=msg[msg.index('#')+1:] if check=='pingServer': print 'New climent connecting! Analyzing...' if name in clientipdic: msg='0' sock.sendto(msg,addr) else: print 'new client logon!' for each in clientipdic: head=name back='已登录!' backmsg=name+back address=str(clientipdic[each]) sock.sendto(msg,(address,int(clientportdic[each]))) msg='1' sock.sendto(msg,(clientip,clientport)) clientipdic[name]=clientip clientportdic[name]=str(clientport) except: newmsg=data for each in clientipdic: address=str(clientipdic[each]) sock.sendto(newmsg,(address,int(clientportdic[each]))) time.sleep(0.1) except: flag=1 Flag=1 print 'Error:Recive threading sets faild!' file_output.write('Error:Recive threading sets faild!') except: flag=1 Flag=1 print 'Error:socket setting is Faild!' file_output.write('Error:socket setting is Faild!') def close(): socket.close() ```

C# Socket 移动端数据丢失?

事情是这样的:在使用unity开发手机应用,服务器端下发**1435**长度的char数组。然而手机App只收到**1428**个字节。 奇怪的是在**电脑**上收到的消息长度是1435(正确)。 以下是我的测试: ①切换手机的网络(无线1):收到**1428**(每次都是1428) ②切换手机的网络(无线2):收到**1300**(每次都是1300) ③切换手机的网络(无线3):收到**1260**(每次都是1260) ④换成平板测试:测试结果如①②③,说明这个不是设备的问题。 以下为特定网络下的测试结果: ①服务器端下发1435个字节,手机只能收到1260个字节 ②服务器端下发1261个字节,手机只能收到1260个字节 ③服务器端下发1260个字节,手机收到1260个字节 ④服务器端下发1259个字节,手机收到1259个字节。 ``` public class StateObject { // Client socket. public Socket workSocket = null; // Size of receive buffer. public const int BufferSize = 2048; // Receive buffer. public byte[] buffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder(); public byte[] recieveDatas = new byte[]{}; } public delegate void InceptData(byte[] getBytes); public class TCPClient { public string TCPserverName = "name"; public string TCPserverIP = "自己的IP地址"; public int TCPserverPort = 1111; public Socket clientSocket; public InceptData recievet; public int charSize = 0; int count = 0; public TCPClient() { SocketConnect(); } public TCPClient(string Ip, int Port) { this.TCPserverIP = Ip; this.TCPserverPort = Port; SocketConnect(); } public void SocketConnect() { IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(TCPserverIP), TCPserverPort); clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { IAsyncResult result = clientSocket.BeginConnect(ipe, new AsyncCallback(connectCallback), clientSocket); } catch (Exception e) { Debug.LogException(e); } } private void connectCallback(IAsyncResult asyncConnect) { receive(); } public void Send(byte[] sendbytes) { if (clientSocket == null) return; if (!clientSocket.Connected) { clientSocket.Close(); return; } try { IAsyncResult asyncSend = clientSocket.BeginSend(sendbytes, 0, sendbytes.Length, SocketFlags.None, new AsyncCallback(sendCallback), clientSocket); } catch (System.Exception e) { } } private void sendCallback(IAsyncResult asyncSend) { } public void receive() { try { StateObject so = new StateObject(); so.workSocket = clientSocket; //第一次读取数据的总长度 clientSocket.BeginReceive(so.buffer, 0, prefixSize, 0, new AsyncCallback(receivedCallback), so); } catch (System.Exception e) { Debug.Log(e.ToString()); clientSocket.Close(); } } //字符串长度标志 public int prefixSize = 4; public MemoryStream receiveData = new MemoryStream(); public int curPrefix = 0;//需要读取的数据总长度 public void receivedCallback(IAsyncResult ar) { receiveData = new MemoryStream(); try { StateObject so = (StateObject)ar.AsyncState; Socket client = so.workSocket; int readSize = client.EndReceive(ar); //结束读取、返回已读取的缓冲区里的字节数组长度 //将每次读取的数据、写入内存流里 this.charSize = readSize; count++; if (readSize > 0) { receiveData.Write(so.buffer, 0, readSize); receiveData.Position = 0; byte[] presixBytes = new byte[prefixSize]; receiveData.Read(presixBytes, 0, prefixSize); //--------解析出该消息总字节的长度 curPrefix = 0; foreach (byte a in presixBytes) { string s = a.ToString(); curPrefix = curPrefix * 256 + int.Parse(s); } //解析正文 byte[] datas = new byte[curPrefix - 4]; receiveData.Read(datas, 0, datas.Length); receiveDataLoad(datas); } //继续接收下次游戏 client.BeginReceive(so.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(receivedCallback), so); } catch (System.Exception e) { Closed(); } } private void receiveDataLoad(byte[] bytes) { byte[] getByte = new byte[bytes.Length]; System.Array.Copy(bytes, 0, getByte, 0, bytes.Length); recievet(getByte); } public void Closed() { try { if (clientSocket != null && clientSocket.Connected) { clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } clientSocket = null; } catch (System.Exception e) { Debug.Log(e); clientSocket.Close(); clientSocket = null; } } } ``` 若有解惑,不胜感激。

客户端第二次输入用户名时,会提示主线程由于软件引起连接中断异常,求大神分析原因!

/* 需求: 在客户端,输入用户名,如果该用户名在系统数据库存在,则提示欢迎登陆,如果不存在,则提示用户不存在,每个IP限制登陆三次 */ import java.io.*; import java.net.*; class LoginClient { public static void main(String[] args)throws Exception { Socket s=new Socket("192.168.100.100",10001); //创建客户端源为控制台的读入流 while(true){ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //创建打印流,将控制台读入的数据打印到网络输出流 PrintWriter pw=new PrintWriter(s.getOutputStream(),true); //创建带缓冲器的网络输入流,用来读取服务端反馈的数据 BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=br.readLine(); if(line==null) break; if("over".equals(line)) break; pw.println(line); //将服务器端反馈的信息输出在控制台上 String info=bufin.readLine(); System.out.println(info); /*if(info.contains("欢迎")){ return; } */ //br.close(); } s.close(); } } class LoginServer { public static void main(String[] args)throws Exception { //创建服务器端Socket服务 ServerSocket ss=new ServerSocket(10001); while(true){ //当服务器端接收到一个客户端对象时,则开启一个子线程,处理客户端请求 Socket s=ss.accept(); new Thread(new LoginUser(s)).start(); } } } class LoginUser implements Runnable { private Socket s; LoginUser(Socket s){ this.s=s; } public void run(){ String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+":connected"); try{ for(int x=0;x<3;x++){ //创建服务端读取流缓冲器,关联网络输入流,来读取客户端输入的数据 BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream())); //创建服务器端读取流缓冲器,关联文件读取流,来读取指定文件数据 BufferedReader br=new BufferedReader(new FileReader("D:\\Mysql.txt")); //创建打印流,关联客户端网络输出流,来将反馈信息打印到网络输出流传递给客户端 PrintWriter pw=new PrintWriter(s.getOutputStream(),true); String name=brIn.readLine(); String line=null; //添加标记 boolean flag=false; //判断客户端输入的用户名称,在服务器端数据库是否存在 while((line=br.readLine())!=null){ if(name.equals(line)){ flag=true; break; } } if(flag==true){ System.out.println(name+"已登陆"); pw.println(name+":欢迎登陆"); break; } else{ System.out.println(name+":尝试登陆"); pw.println(name+"用户不存在"); break; } } s.close(); } catch(Exception e){ throw new RuntimeException("用户校验失败"); } } }

基于tcp的简易聊天机器人,c++编写,客户端无法连续接收到消息?

客户端程序 #include "pch.h" #include <iostream> #include <Winsock2.h> #include <stdio.h> #include <stdlib.h> #define DATA_BUFFER 1024 //默认缓冲区大小 #pragma comment(lib, "wsock32.lib") int main(int argc, char * argv[]) { WSADATA wsaData; SOCKET sClient; int iPort = 5050; int iLen;//从服务器端接收的数据长度 char buf[DATA_BUFFER];//接收数据的缓冲区 struct sockaddr_in ser;//服务器端地址 char szRecipient[128]; // 服务器地址 //判断参数输入是否正确:client [Server IP] if (argc < 2) { //提示在命令行中输入服务器IP地址 strcpy_s(szRecipient, "127.0.0.1"); } memset(buf, 0, sizeof(buf));//接收缓冲区初始化 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock.\n"); return -1; } //填写要连接的服务器地址信息 ser.sin_family = AF_INET; ser.sin_port = htons(iPort); //inet_addr()将命令行中输入的点分IP地址转换为二进制表示的网络字节序IP地址! ser.sin_addr.s_addr = inet_addr("127.0.0.1"); //建立客户端流式套接口 sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //sClient为SOCKET返回值 if (sClient == INVALID_SOCKET) { printf("socket() Failed: %d\n", WSAGetLastError()); return -1; } //请求与服务器端建立TCP连接 if (connect(sClient, (struct sockaddr *)&ser, sizeof(ser)) == INVALID_SOCKET) { printf("con0 nect() Failed: %d\n", WSAGetLastError()); return -1; } else { //从服务器端接收数据 iLen = recv(sClient, buf, sizeof(buf), 0); if (iLen == 0) return -1; else if (iLen == SOCKET_ERROR) { printf("recv() Failed: %d\n", WSAGetLastError()); return -1; } else printf("recv() data from server: %s\n", buf); } char sendbuf[100]; char recvbuf[100]; int Len = sizeof(ser); while (1) { printf("请输入信息:"); gets_s(sendbuf); send(sClient, sendbuf, strlen(sendbuf) + 1, 0); recv(sClient, recvbuf, strlen(recvbuf) , 0); sprintf_s(buf, sizeof(buf), "%s 说:%s\n\0", "小朱", recvbuf); printf("%s\n", buf); } closesocket(sClient); WSACleanup(); return 0; } 服务端程序: #include "pch.h" #include <iostream> #include <Winsock2.h> #include <stdio.h> #include <stdlib.h> #define DEFAULT_PORT 5050 //服务端默认端口 #pragma comment(lib, "wsock32.lib") int main(int argc, char* argv[]) { int iPort = DEFAULT_PORT; WSADATA wsaData; SOCKET sListen, sAccept; //sListen为创建服务器端套接字,sAccept为创建客户端套接字 int iLen; //客户地址长度 int iSend;//发送数据长度 char buf[] = "I am a server";//要发送给客户的信息 struct sockaddr_in ser, cli;//服务器和客户的地址 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock.\n"); return -1; } sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建服务器端套接口 if (sListen == INVALID_SOCKET) { printf("socket() Failed: %d\n", WSAGetLastError()); return -1; } //以下建立服务器端地址 //使用IP地址族 ser.sin_family = AF_INET; //使用htons()把双字节主机序端口号转换为网络字节序端口号 ser.sin_port = htons(iPort); // htonl()把一个四字节主机序IP地址转换为网络字节序主机地址 //使用系统指定的IP地址INADDR_ANY ser.sin_addr.s_addr = htonl(INADDR_ANY); //bind()函数进行套接定与地址的绑定 if (bind(sListen, (struct sockaddr*)&ser, sizeof(ser)) == SOCKET_ERROR) { printf("bind() Failed: %d\n", WSAGetLastError()); return -1; } //进入监听状态 if (listen(sListen, 5) == SOCKET_ERROR) { printf("lisiten() Failed: %d\n", WSAGetLastError()); return -1; } //初始化客户地址长度参数 iLen = sizeof(cli); sAccept = accept(sListen, (struct sockaddr *)&cli, &iLen); if (sAccept == INVALID_SOCKET) { printf("accept() Failed: %d\n", WSAGetLastError()); return -1; } //输出客户IP地址和端口号 printf("Accepted client IP:[%s], port : [%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port)); //给连接的客户发送信息 iSend = send(sAccept, buf, sizeof(buf)+1, 0); if (iSend == SOCKET_ERROR) { printf("send() Failed: %d\n", WSAGetLastError()); } else { printf("send() byte: %d\n", iSend); } char recvbuf[100] ; //消息接收与发送 FILE *f; //定义文件指针f char szLine[MAX_PATH]; //MAX_PATH是#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度,值为260 char buffer[MAX_PATH]; fopen_s(&f, "D:\\001.txt", "r"); //以“只读”方式打开指针f所指的文件 if (f == NULL) //指针文件为空 { printf("无法打开文件\n"); return -1; } while (1) { recv(sAccept, recvbuf, strlen(recvbuf), 0); printf("%s 说:%s\n", inet_ntoa(cli.sin_addr), recvbuf); fseek(f, 0, SEEK_SET); memset(szLine, 0, MAX_PATH); fgets(szLine, MAX_PATH, f); while (szLine[0] != '#') { if (szLine[0] == 'Q') { char szTemp[MAX_PATH] = {0}; //复制字符串szLine + 2到缓冲区szTemp lstrcpyA(szTemp, szLine + 2); szTemp[lstrlenA(szTemp) - 1] = '\0'; //匹配成功找到答案 if (lstrcmpA(szTemp, recvbuf) == 0) { memset(szLine, 0, MAX_PATH); fgets(szLine, MAX_PATH, f); //参数 szLine+2欲连线的数据内容,参数flags 一般设0, //szLine加2的原因是从读取的字符的第三个字符开始输出,因为前两个字符为A: send(sAccept, szLine + 2, strlen(szLine) + 1, 0); break; } } memset(szLine, 0, MAX_PATH); fgets(szLine, MAX_PATH, f); } if (szLine[0] == '#') { memset(buffer, 0, MAX_PATH); sprintf_s(buffer, "小朱的功能还有待完善......\n"); send(sAccept, buffer+2, strlen(buffer)+1, 0); } } closesocket(sAccept); closesocket(sListen); WSACleanup(); return 0; } 我是通过在服务端插入一个文件是它们进行通话 D:\\001.txt ![图片说明](https://img-ask.csdn.net/upload/201906/14/1560443751_246381.png)![图片说明](https://img-ask.csdn.net/upload/201906/14/1560443767_617333.png)!

Socket编程java.net.BindException: Address already in use: JVM_Bind

本人最近想学Socket编程:无奈遇到个问题.不知道是啥原因,还请各位不吝赐教. 问题是这样的:我想用Socket在服务端读取文本文件,第一次运行的时候,什么都没数出来,(不停止第一次开启的服务)第二次输出了文本内容,却报了个地址被占用的错.这是为什么呢? Socket客户端: package socket; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.SocketChannel; public class socketClient { private String ip; public socketClient() { // TODO Auto-generated constructor stub } public socketClient(String ip){ this.ip=ip; } public void client(){ PrintWriter print=null; BufferedReader read=null; File file=null; try { Socket ket=new Socket(ip,9000);//与服务器取得链接. file=new File("e:\\我的地址.txt"); read=new BufferedReader(new InputStreamReader(new FileInputStream(file))); String readLine=null; print=new PrintWriter(ket.getOutputStream(),true); while((readLine=read.readLine())!=null){ print.print(readLine); } } catch (Exception e) { e.printStackTrace(); }finally{ try { read.close(); print.close(); } catch (IOException e) { e.printStackTrace(); } } } } Socket服务器: package socket; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SocketRemot { private Map map=new HashMap(); public void reMoteRun(){ BufferedReader read=null; PrintWriter write=null; try { while(true){ ServerSocket soc=new ServerSocket(9000);//为服务器Socket指定端口 Socket socket=soc.accept();//服务器端阻塞,一直等待客户端来访问. map.put(socket.getPort()+"",socket); System.out.println("我在等待......."); //读取客户端文件. //得到socket读取文件的流//字节流 /* * InputStream是用于读取二进制文件的流,而服务器端读取的文件很有可能是文本形式的.所以要转换为字符流 * 字节流和字符流之间的转换通过InputStreamReader,和OutputStreamWrite来转换. */ read=new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取读文件的字符流 write=new PrintWriter(socket.getOutputStream(),true);//通过现有的output流来创建新的printWrite流 System.out.println(read.readLine()); // String str=null; // while((str=read.readLine())!=null){ // System.out.println(read.readLine());//边读边写. // } // write.close(); // read.close(); // socket.close(); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(read!=null){ read.close(); } if(write!=null){ write.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void closeSocket(){ Iterator tor=map.values().iterator(); while(tor.hasNext()){ Socket soc=(Socket)tor.next(); if(!soc.isClosed()){ try { soc.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } Test: package socket; import java.net.InetAddress; import java.net.UnknownHostException; public class Test { public static void main(String[] args) { SocketRemot remot=new SocketRemot(); socketClient ket=new socketClient(getAddIp()); remot.reMoteRun(); ket.client(); remot.closeSocket(); } public static String getAddIp(){ String serverIp=null; try { serverIp = InetAddress.getLocalHost().toString(); serverIp = serverIp.substring(serverIp.indexOf("/")+1); System.out.println(serverIp); } catch (UnknownHostException e) { e.printStackTrace(); } return serverIp; } } error: java.net.BindException: Address already in use: JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) at java.net.AbstractPlainSocketImpl.bind(Unknown Source) at java.net.PlainSocketImpl.bind(Unknown Source) at java.net.ServerSocket.bind(Unknown Source) at java.net.ServerSocket.<init>(Unknown Source) at java.net.ServerSocket.<init>(Unknown Source) at socket.SocketRemot.reMoteRun(SocketRemot.java:25) at socket.Test.main(Test.java:10)

Ext中组件加载问题

在使用Ext的时候,我在一个js文件定义了一个form表单组件,在另一个js文件中通过组件的id来获得组件(Ext.Cmp())在ie7下能够获得组件,但是在ie6和ff3下都不能找到这个组件,错误提示这个组件未定义. 通过我自己的测试: Ext.ComponentMgr.all.each(function(r){alert(r.id)}) 发现定义的form表单在ie6和ff下都没有被加载. 在定义form表单的js文件里面我做的测试 alert("aa"); var form = new Ext.FormPanel({ ... }); alert("bb"); alert("aa")执行了的,但是alert("bb");未执行 请问这个是怎么回事? [b]问题补充:[/b] 是我写错了,是用的Ext.getCmp(); [b]问题补充:[/b] js代码: 第一次用Ext ,不足之处请指教 //用户痕迹统计树形菜单 var statisticsTree = new Ext.tree.TreePanel({ id:'statisticsTree', frame:false, border:false, autoScroll:true, enableDD:false,//是否支持拖拽效果 containerScroll: true,//是否支持滚动条 split:true, rootVisible:false,//是否显示跟节点 //collapseMode:'mini',//在分割线处出现按钮 collapsible: true, margins:'0 0 5 5', loader:new Ext.tree.TreeLoader({ dataUrl:'js/extjs/statisticsTree.json' }) }); var statisticsRoot = new Ext.tree.AsyncTreeNode({ text:'统计', draggable:false, id:'statisticsRoot' }); statisticsTree.setRootNode(statisticsRoot); //ippv统计 var ippv_ds = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ //url:'/platform/management/statistics/statisticsIpPv.htm', method:'post' }), autoLoad:false, remoteSort:false, //服务器端排序 reader: new Ext.data.JsonReader({root:'list',totalProperty:'pagination.count'}, [ {name: '_date'}, {name: 'visitorquantity',type:'int'}, {name: 'ipquantity',type:'int'}, {name: 'pvquantity',type:'float'} ]) }); ippv_ds.load({params:{'pagination.begin':0,'pagination.pageSize':20}}); var sm=new Ext.grid.CheckboxSelectionModel();//表格复选列 var ippv_cm = new Ext.grid.ColumnModel([ {header:'日期',dataIndex:'_date',renderer: function(value){ if(value!=null&&value.length>0){ var d = value.split('T'); return d[0]; } return value; }}, {header:'访客数',dataIndex:'visitorquantity'}, {header:'独立IP数',dataIndex:'ipquantity'}, {header:'PV',dataIndex:'pvquantity'} ]); ippv_cm.defaultSortable = true; var ippv_form = new Ext.FormPanel({ id:'ippv_form', border: false, labelAlign:'right', region:'north', height:80, frame:true, items:[new Ext.form.FieldSet({ title:'查询', columnWidth: 1, layout: 'column', border: true, anchor:'50%', labelWidth: 50, items:[{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '日期:从', name: 'beginDate1', format:'Y-m-d', id:'beginDate1', anchor: '90%' }] },{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '到', name: 'endDate1', format:'Y-m-d', id:'endDate1', anchor:'90%' }] },{ columnWidth:.2, layout: 'form', border:false, items: [{ xtype:'button', text:'查询', handler: function(){ var beginDate = document.getElementById('beginDate1').value; var endDate = document.getElementById('endDate1').value; var url = "/platform/management/statistics/statisticsIpPv.htm?beginDate="+beginDate+"&endDate="+endDate; ippv_ds.proxy = new Ext.data.HttpProxy({ url:url, method:'post' }); ippv_ds.reload(); ippv_grid.reconfigure(ippv_ds,ippv_cm); } }] }] })] }); var ippv_grid = new Ext.grid.GridPanel({ id: 'ippv_grid', region:'center', loadMask:true, ds: ippv_ds, cm: ippv_cm, height:500, layout:'fit', frame:true, bbar: new Ext.PagingToolbar({ pageSize: 20, store: ippv_ds, paramNames:{start: 'pagination.begin', limit: 'pagination.pageSize'}, displayInfo: true, displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg: "没有记录" }) }); //联盟-搜索引擎统计 var union_search_ds = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ //url:'/platform/management/statistics/statisticsFrom.htm', method:'post' }), remoteSort:true, //服务器端排序 reader: new Ext.data.JsonReader({root:'list',totalProperty:'pagination.count'}, [ {name: '_from'}, {name: 'request_quantity',type:'int'}, {name: 'average_request_page_quantity',type:'float'}, {name: 'bounce_rate',type:'float'}, {name: 'register_visitor',type:'int'}, {name: 'registration_rate',type:'float'}, {name: 'order_generation_quantity',type:'int'}, {name: 'listprice',type:'float'}, {name: 'visitor_back_quantity',type:'int'}, {name: 'visitor_quantity',type:'int'}, {name: 'average_back_quantity',type:'float'} ]) }); union_search_ds.load({params:{'pagination.begin':0,'pagination.pageSize':20}}); var union_search_cm = new Ext.grid.ColumnModel([ {header:'来源地',dataIndex:'_from'}, {header:'访问量',dataIndex:'request_quantity'}, {header:'平均访问页面',dataIndex:'average_request_page_quantity'}, {header:'跳出率',dataIndex:'bounce_rate'}, {header:'注册率',dataIndex:'registration_rate'}, {header:'注册人数',dataIndex:'register_visitor'}, {header:'下单人数',dataIndex:'order_generation_quantity'}, {header:'销售码洋',dataIndex:'listprice'}, {header:'回访客数量',dataIndex:'visitor_back_quantity'}, {header:'访客数量',dataIndex:'visitor_quantity'}, {header:'平均回访次数',dataIndex:'average_back_quantity'} ]); union_search_cm.defaultSortable = true; var union_search_form = new Ext.FormPanel({ id:'union_search_form', border: false, labelAlign:'right', region:'north', height:80, frame:true, items:[new Ext.form.FieldSet({ title:'查询', columnWidth: 1, layout: 'column', border: true, anchor:'50%', labelWidth: 50, items:[{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '日期:从', name: 'beginDate2', format:'Y-m-d', id:'beginDate2', anchor: '90%' }] },{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '到', name: 'endDate2', format:'Y-m-d', id:'endDate2', anchor:'90%' }] },{ columnWidth:.2, layout: 'form', border:false, items: [{ xtype:'button', text:'查询', handler: function(){ var beginDate = document.getElementById('beginDate2').value; var endDate = document.getElementById('endDate2').value; var url = "/platform/management/statistics/statisticsFrom.htm?beginDate="+beginDate+"&endDate="+endDate; union_search_ds.proxy = new Ext.data.HttpProxy({ url:url, method:'post' }); union_search_ds.reload(); union_search_grid.reconfigure(union_search_ds,union_search_cm); } }] }] })] }); var union_search_grid = new Ext.grid.GridPanel({ id: 'union_search_grid', region:'center', loadMask:true, ds: union_search_ds, cm: union_search_cm, height:500, layout:'fit', frame:true, bbar: new Ext.PagingToolbar({ pageSize: 20, store: union_search_ds, paramNames:{start: 'pagination.begin', limit: 'pagination.pageSize'}, displayInfo: true, displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg: "没有记录" }) }); //搜索引擎关键字统计 var keyword_ds = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ //url:'/platform/management/statistics/statisticsKeyword.htm', method:'post' }), autoLoad:false, remoteSort:true, //服务器端排序 reader: new Ext.data.JsonReader({root:'list',totalProperty:'pagination.count'}, [ {name: '_from'}, {name: 'keyword',type:'string'}, {name: 'search_quantity',type:'int'} ]) }); keyword_ds.load({params:{'pagination.begin':0,'pagination.pageSize':20}}); var keyword_cm = new Ext.grid.ColumnModel([ {header:'来源地',dataIndex:'_from'}, {header:'关键字',dataIndex:'keyword'}, {header:'搜索次数',dataIndex:'search_quantity'} ]); keyword_cm.defaultSortable = true; var keyword_form = new Ext.FormPanel({ id:'keyword_form', border: false, labelAlign:'right', region:'north', height:80, frame:true, items:[new Ext.form.FieldSet({ title:'查询', columnWidth: 1, layout: 'column', border: true, anchor:'50%', labelWidth: 50, items:[{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '日期:从', name: 'beginDate3', format:'Y-m-d', id:'beginDate3', anchor: '90%' }] },{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '到', name: 'endDate3', format:'Y-m-d', id:'endDate3', anchor:'90%' }] },{ columnWidth:.2, layout: 'form', border:false, items: [{ xtype:'button', text:'查询', handler: function(){ var beginDate = document.getElementById('beginDate3').value; var endDate = document.getElementById('endDate3').value; var url = "/platform/management/statistics/statisticsKeyword.htm?beginDate="+beginDate+"&endDate="+endDate; keyword_ds.proxy = new Ext.data.HttpProxy({ url:url, method:'post' }); keyword_ds.reload(); keyword_grid.reconfigure(keyword_ds,keyword_cm); } }] }] })] }); var keyword_grid = new Ext.grid.GridPanel({ id: 'keyword_grid', ds: keyword_ds, cm: keyword_cm, region:'center', loadMask:true, height:500, layout:'fit', frame:true, bbar: new Ext.PagingToolbar({ pageSize: 20, store: keyword_ds, paramNames:{start: 'pagination.begin', limit: 'pagination.pageSize'}, displayInfo: true, displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg: "没有记录" }) }); // 页面访问数量统计 var access_quantity_ds = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ //url:'/platform/management/statistics/statisticsPage.htm', method:'post' }), autoLoad:false, remoteSort:true, //服务器端排序 reader: new Ext.data.JsonReader({root:'list',totalProperty:'pagination.count'}, [ {name: 'page'}, {name: 'quantity',type:'int'} ]) }); access_quantity_ds.load({params:{'pagination.begin':0,'pagination.pageSize':20}}); var access_quantity_cm = new Ext.grid.ColumnModel([ {header:'页面',dataIndex:'page'}, {header:'访问数量',dataIndex:'quantity'} ]); access_quantity_cm.defaultSortable = true; var access_quantity_form = new Ext.FormPanel({ id:'access_quantity_form', border: false, labelAlign:'right', region:'north', height:80, frame:true, items:[new Ext.form.FieldSet({ title:'查询', columnWidth: 1, layout: 'column', border: true, anchor:'50%', labelWidth: 50, items:[{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '日期:从', name: 'beginDate4', format:'Y-m-d', id:'beginDate4', anchor: '90%' }] },{ columnWidth:.4, layout: 'form', border:false, items: [{ xtype:'datefield', fieldLabel: '到', name: 'endDate4', format:'Y-m-d', id:'endDate4', anchor:'90%' }] },{ columnWidth:.2, layout: 'form', border:false, items: [{ xtype:'button', text:'查询', handler: function(){ var beginDate = document.getElementById('beginDate4').value; var endDate = document.getElementById('endDate4').value; var url = "/platform/management/statistics/statisticsPage.htm?beginDate="+beginDate+"&endDate="+endDate; access_quantity_ds.proxy = new Ext.data.HttpProxy({ url:url, method:'post' }); access_quantity_ds.reload(); access_quantity_grid.reconfigure(access_quantity_ds,access_quantity_cm); } }] }] })] }); var access_quantity_grid = new Ext.grid.GridPanel({ id: 'access_quantity_grid', ds: access_quantity_ds, cm: access_quantity_cm, region:'center', loadMask:true, height:500, layout:'fit', frame:true, bbar: new Ext.PagingToolbar({ pageSize: 20, store: access_quantity_ds, paramNames:{start: 'pagination.begin', limit: 'pagination.pageSize'}, displayInfo: true, displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg: "没有记录" }) }); //各来源地销售统计 var from_ds = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ //url:'/platform/management/statistics/statisticsCommodity.htm', method:'post' }), autoLoad:false, remoteSort:true, //服务器端排序 reader: new Ext.data.JsonReader({root:'list',totalProperty:'pagination.count'}, [ {name: '_from'}, {name: 'commodity.name',type:'string'}, {name: 's',type:'int'} ]) }); from_ds.load({params:{'pagination.begin':0,'pagination.pageSize':20}}); var from_cm = new Ext.grid.ColumnModel([ {header:'来源地',dataIndex:'_from'}, {header:'商品名',dataIndex:'commodity.name',sortable:false}, {header:'销售数量',dataIndex:'s'} ]); from_cm.defaultSortable = true; var from_form = new Ext.FormPanel({ id:'from_form', border: false, labelAlign:'right', region:'north', height:140, frame:true, items:[new Ext.form.FieldSet({ title:'查询', columnWidth: 1, layout: 'column', border: true, anchor:'50%', labelWidth: 60, items:[{ columnWidth:.4, layout: 'form', border:false, items: [{ width:130, xtype:'datefield', fieldLabel: '日期,从', name: 'beginDate5', format:'Y-m-d', id:'beginDate5' }, { width:130, xtype:'textfield', fieldLabel: '来源地', allowBlank: false, blankText:'来源地不能为空', name: 'from', id:'from' }] },{ columnWidth:.4, layout: 'form', items: [{ width:130, xtype:'datefield', fieldLabel: '到', format:'Y-m-d', name: 'endDate5', id:'endDate5' },{ width:130, xtype:'numberfield', fieldLabel: '商品编号', name: 'commodityId', id:'commodityId' }] },{ columnWidth:.4, layout: 'form', bodyStyle:'padding:20px 5px 0', border:false, items: [{ xtype:'button', text:'查询', handler: function(){ if (!from_form.getForm().isValid()) { return; } var beginDate = document.getElementById('beginDate5').value; var endDate = document.getElementById('endDate5').value; var from = from_form.getForm().findField("from").getValue(); var commodityId = from_form.getForm().findField("commodityId").getValue(); var url = "/platform/management/statistics/statisticsCommodity.htm?beginDate="+beginDate+"&endDate="+endDate+"&from="+from+"&commodityId="+commodityId; from_ds.proxy = new Ext.data.HttpProxy({ url:url, method:'post' }); from_ds.reload(); from_grid.reconfigure(from_ds,from_cm); } }] }] })] }); var from_grid = new Ext.grid.GridPanel({ id: 'from_grid', ds: from_ds, cm: from_cm, region:'center', loadMask:true, layout:'fit', height:500, frame:true, bbar: new Ext.PagingToolbar({ pageSize: 20, store: from_ds, paramNames:{start: 'pagination.begin', limit: 'pagination.pageSize'}, displayInfo: true, displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条', emptyMsg: "没有记录" }) }); [b]问题补充:[/b] 2个alert()之间的代码,是user_trace.statistics.js 里面ippv_form [b]问题补充:[/b] 页面太简单了嘛,直接引用2个js文件就可以了 [b]问题补充:[/b] 请问怎么才是js封装到位了,给个例子嘛

每隔一晚 第一次socket发送消息就会失败,第2次又正常了

<div class="iteye-blog-content-contain" style="font-size: 14px;"> <p>每隔一晚, 第一次socket给服务器端发送消息就会失败,但第2次又正常了,失败提示的错误如下:</p> <p> </p> <pre name="code" class="java">2013-11-30 9:45:34 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet spring3 threw exception java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(Unknown Source) at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113) at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160) at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188) at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2452) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2906) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2895) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3438) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548) at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4916) at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331) at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317) at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354) at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy22.findWebContentList(Unknown Source) at com.travel.spring.web.VideoController.beginPlay(VideoController.java:260) at sun.reflect.GeneratedMethodAccessor158.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) </pre> <p> </p> <p>socket发送消息代码如下:</p> <pre name="code" class="java">try { byte[] receive = new byte[200]; //长度为200 String ip = "192.168.1.222"; int port = 9996; //发送回收资源的scoket字符串 String send ="STKNET_DATA;STK_WEBSYS;STKMOD_NETVIDEO;STKNETMSG_FREE_LIVESCENERY_RES;1;1;1;1;50;stream/abc/"; Socket sock = new Socket(ip, port); sock.getOutputStream().write(new SocketClient(send).getbuf()); port=8888; //接收端口 sock.getInputStream().read(receive); SocketClient ee = SocketClient.getSocketClient(receive); sock.close(); } catch (Exception e) { e.printStackTrace(); }</pre> <p> </p> <p>求指点。</p> </div>

httpClient 指定端口访问网络

我项目是java的, 由于我的服务器只开了几个端口给我访问网络,服务器再局域网,访问网络要通过一个堡垒服务器, 现在我只能使用我们服务器的四个端口,这四个端口能访问网络, 由于HTppClient 是随机使用端口去发起请求的,所以我现在就想知道能不能指定httpCLient的使用端口 我百度了一下,试了一下设置代码, 但代理只能设置回本机,而且端口也还是那几个可以使用 那不就是一个死循环? 有没有办法,能让httpClient 指定使用哪个端口访问网络, 就好像Socket那样,指定使用哪个端口收发 求大大帮忙,我现在思路是,如果指定不了,我只能用Socket 自己实现http协议了, 真心求,我第一次来Csdn这里提问,感觉CSDN越做越好了~

C#中的tcpclient中断问题

我编辑了代码用于和高清摄像机通讯,摄像机作为服务器端,分别有两个端口,一个端口用于控制命令的交互,一个命令用于获取摄像机图像,所使用的通讯代码是一样的。 但图像通讯是连续不间断的,每收到一张图片,要回复一个继续的命令,这个一直工作正常。但控制命令的交互就总是出问题,只能第一次发送是正确的,后面发送就无响应了,相机也不会有任何响应发生。 看网上有介绍说是异步通讯的问题,在while循环里的会一直工作,没有while循环的会出现中断情况,可我不知道如何实现,网上的代码都是简单的发送,关闭,我也尝试了发送前建立,发送结束关闭,但还是同样的问题。 请各位大侠给予指导,谢谢! public bool networkbuild()//建立端口连接 { if (client == null) { try { client = new TcpClient(networkip, networkport); netstream = client.GetStream(); return true; } catch (Exception ex) { MessageBox.Show(ex.Message); } return false; } return true; } public void networkclose()//关闭端口连接 { if (client != null) { try { netstream.Close(); client.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } public bool netsendmessage(byte[] message,int length)//发送数据 { if (netconnected) { try { netstream.Write(message, 0, length); return true; } catch (Exception ex) { MessageBox.Show(ex.Message); } return false; } MessageBox.Show("连接已关闭"); return false; } public bool netreadmessage(byte[] message, int length)//读取数据 { try { int i = 0; int cont = 0; if (netstream != null) { while (i<length) { cont = netstream.Read(message, i, length - i); if (cont > 0) { i += cont; } } } else { return false; } return true; } catch (Exception ex) { MessageBox.Show(ex.Message); } return false; }

QT平台Socket编程问题

我在QT开启了一个socket服务器端,逻辑是与客户端建立连接后就开启定时器不停的接受和发送数据,但是我用TCP工具创建了一个客户端测试的时候,发现连接可以建立,客户端却没有收到服务器发送的数据,求大家帮我看看是代码哪里逻辑有问题吗,第一次搞socket编程 下面先放个我的开启服务器的函数,这个函数会与客户端建立lian'jie SOCKET CComm::StartServer() { //初始化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 e" "rror !"); return 0; } //绑定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8765); sin.sin_addr.S_un.S_addr = inet_addr("192.168.0.107"); 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); 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)); break; } int SendTimeout = 1000; //1000ms int RecvTimeout = 1000; //1000ms setsockopt(sClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&RecvTimeout, sizeof(int)); setsockopt(sClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&SendTimeout, sizeof(int)); connectState = true; return sClient; } 然后就是运行QT程序 开启服务器成功后,再开启定时器定时接收 /***********建立本地服务器*******/ void Dialog::on_Btn_StartServer_clicked() { SOCKET testsClient = test.StartServer(); if(connectState == true && flag == 0) { //和上位机通讯的定时器// _TCPServerTimeout = new QTimer(this); _TCPServerTimeout->start(90); connect(_TCPServerTimeout, SIGNAL(timeout()), this, SLOT(_onTCPServerTimeout())); flag = 1; } } void Dialog::_onTCPServerTimeout() { int ret; const char * sendData = "测试,接收到TCP客户端消息!\n"; char revData[255]; while (true) { //接收数据 ret = recv(testsClient, revData, 255, 0); if (ret > 0) { revData[ret] = 0x00; } send(testsClient, sendData, strlen(sendData), 0); } }

请问如何用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下网络编程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)

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

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

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

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

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

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

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

昨天看到一档综艺节目,讨论了两个话题:(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、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

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

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

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

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

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

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

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

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

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

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

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

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

面试:第十六章:Java中级开发

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

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

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

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

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

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

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

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大胆预测下未来5年的Web开发

在2019年的ReactiveConf 上,《Elm in Action》的作者Richard Feldman对未来5年Web开发的发展做了预测,很有意思,分享给大家。如果你有机会从头...

立即提问
相关内容推荐