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

服务端循环accept,如果每次客户端只发送一次请求,就没问题,
但是如果客户端循环发送数据,服务端就接收不到一次连接中的第二次请求。
下面贴代码,求解这个问题到底咋回事

服务端 sock_serv.c

#include
#include
#include
#include
#include
#include
#include
#include

#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
#include
#include
#include
#include
#include
#include

#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);

}


2个回答

qq28970484
c小恩俊 不好意思,是我自己二了,已经知道是怎么回事了
接近 4 年之前 回复
qq28970484
c小恩俊 就是说,send了一次之后,然后recv,然后循环在send就报错了,这个是为啥能说一下不
接近 4 年之前 回复
qq28970484
c小恩俊 我大概看了一下代码,你这个客户端属于一次性的短链接,我贴的这个程序如果搞成短链接的也是没有问题的,一次connect多次send和recv要怎么做呢?
接近 4 年之前 回复

服务器端,要为接受连接的socket,专门创见一个线程用于接收和发送信息

qq28970484
c小恩俊 嗯,现在开始阶段没用线程,造成这个问题的原因是我忘记循环recv了。。。才导致的不能接收到客户端的第二次发送的。。。
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于socket Tcp客户端连接超时的问题
![图片说明](https://img-ask.csdn.net/upload/201708/11/1502431558_962329.png) 简单描述一下需求:我这里需要通过socket客户端长连接一直不停的往服务器发送数据,我这边也对socket就行判断了,如果连接不上就关闭再重新连接,过几个小时就会出现连接超时的情况,大致就是这样,求大神指教。。。
java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端
socket连接部分可以省略 只要客户端的发送数据部分和服务端的接收数据部分 我主要不知道java和C#的字符集以及该用什么方法比较好
socket向指令客户端发送消息问题
我写了一个socket服务端程序,A客户端长连接上来,我就把socket存在一个list里面,当B客户端发送数据上来,我就把数据发给A客户端,如何能够等待A客户端返回数据以后,我再返回数据返回给B客户端呢?每次等待A客户端发送数据上来,就在另外一个线程里面了,导致到B一直收不到返回信息。我想实现的是,B发送上来的时候我发给A,等待A返回数据后,再返回给B。 哪个大神有类似的代码demo,![图片说明](https://img-ask.csdn.net/upload/201712/27/1514353373_323281.png) 图片上,这是个for循环,当B发送命令给服务端以后,我根据命令找到了目标A,发送命令给A了,如何等待A返回数据以后再返回给B呢,后面不知道如何实现
linux 下socket编程,客户端连接服务器失败
最近因为课程需要学习socket网络编程,运行的时候客户端无法与服务器建立连接,请原谅菜鸟没有积分,希望各位大佬给点帮助,解决下问题 这个是运行报错的截图 ![图片说明](https://img-ask.csdn.net/upload/201910/26/1572069361_597125.png) 以下是按照课本上编写的代码 客户端client.c ``` #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define PROTOPORT 5188 extern int errno; char localhost[] = "localhost"; int main(int argc, char* argv[]) { struct hostent *ptrh; struct sockaddr_in servaddr; int sockfd; int port; char* host; int n; char buf[1000]; memset((char*)&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; if(argc > 2){ port = atoi(argv[2]); }else{ port = PROTOPORT; } if(port > 0){ servaddr.sin_port = htons((uint16_t)port); }else{ fprintf(stderr, " bad port number %s\n", argv[2]); exit(1); } if(argc > 1){ host = argv[1]; }else{ host = localhost; } ptrh = gethostbyname(host); if((char*)ptrh == NULL){ fprintf(stderr, " invalid host: %s\n", host); exit(1); } memcpy(&servaddr.sin_addr, ptrh->h_addr_list[0], ptrh->h_length); sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd > 0){ fprintf(stderr, " socket creation failed\n"); exit(1); } //请求连接到服务器 if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))){ fprintf(stderr, "connect failed\n"); exit(1); } //从服务器读取数据,显示到用户屏幕上 n = recv(sockfd, buf, sizeof(buf), 0); while(n > 0){ write(1, buf, n); n = recv(sockfd, buf, sizeof(buf), 0); } //关闭连接 close(sockfd); //退出 exit(0); return 0; } ``` 服务器端server.c ``` #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> #include <unistd.h> #define PROTOPORT 5188 #define QLEN 6 int visits = 0; int main(int argc, char * argv[]) { struct sockaddr_in servaddr; //存放服务器网络地址结构 struct sockaddr_in clientaddr; //存放客户机网络地址结构 int listenfd; int clientfd; int port; int alen; char buf[1000]; memset((char*)& servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; if(argc >1){ port = atoi(argv[1]); }else{ port = PROTOPORT; } if(port > 0){ servaddr.sin_port = htons((uint16_t)port); }else{ fprintf(stderr, " bad port nuber %s\n", argv[1]); exit(1); } listenfd = socket(AF_INET, SOCK_STREAM, 0); if(listenfd < 0){ fprintf(stderr, "socket creation failed\n"); exit(1); } if(bind(listenfd, (struct sockaddr*) & servaddr, sizeof(servaddr)) < 0){ fprintf(stderr, " bind failed\n"); exit(1); } if(listen(listenfd, QLEN) < 0){ fprintf(stderr, "listen filed\n"); exit(0); } while(1) { alen = sizeof(clientaddr); if((clientfd = accept(listenfd, (struct sockaddr*) & clientaddr, (socklen_t*)&alen)) < 0){ fprintf(stderr, "accept failed\n"); exit(1); } visits++; sprintf(buf, "this server has been contacted %d time \n", visits); send(clientfd, buf, strlen(buf), 0); close(clientfd); } return 0; } ```
java socket客户端往服务器端发送文件
java socket客户端往服务器端发送文件包括二进制文件word文件, 请问文件传输的通讯协议该如何定义,不知道怎么自定义通讯协议。 我所说的发送文件是指多个文件,不是简单的一个文件。我想要的是自定义协议,客户端与 服务器端通讯的协议。
Java 如何在建立 Socket 通信后主动向 C#客户端发送信息
使用Java服务器与C#客户端成功建立套接字通信后,Java服务器如何主动向C#客户端发送消息?我只能在成功建立的那一刻向客户发送信息,但这不是我想要的。 项目启动时将开始创建套接字连接,但在建立之后,我无法自己向客户端发送信息。 -----这是负责建立套接字通信的代码。 ``` public void openSocket() throws IOException { Socket socket = null; try { ServerSocket serverSocket = new ServerSocket(5656); log.info("server msg : UnitySocket server start {port : [5656]}"); socket = serverSocket.accept(); log.info("server msg : socket msg [client send !]"); inputStream = new BufferedInputStream(socket.getInputStream()); byte[] out_massage = new byte[messageLengthBytes]; inputStream.read(out_massage); log.info("server msg : client msg is [ "+(new String(out_massage,"utf-8"))); OutputStream outputStream = socket.getOutputStream(); outputStream.write(socket_massage.getBytes()); // socket_massage = "welcome_send_server_!" } catch (IOException e) { e.printStackTrace(); }finally { if(socket != null){ socket.close(); } socket = null; } ``` 这是要发送给客户端的数据 ``` public Boolean askMoveUp(String address, String project, String name, String massage, String startTime, String endTime, String token) throws IOException { StringBuffer stringBuffer = new StringBuffer(); SocketMassage socketMassage = new SocketMassage(); String msg; stringBuffer.append(address).append("_"); stringBuffer.append(project).append("_"); stringBuffer.append(name).append("_"); stringBuffer.append(massage).append("_"); stringBuffer.append(startTime); msg = stringBuffer.toString(); socketMassage.setMsg(msg); return true; } ``` 我想要做的是askMoveUp()方法中的msg数据。如何在openSocket()方法中像socket_massage一样发送给客户端?当项目启动时,socket_massage中的数据被发送到客户端,但msg是如何发送的?希望大家能给我一个帮助,谢谢!
java socket通讯 服务端如何主动给指定的客户端发送消息?
如题 java socket通讯 服务端如何主动给指定的客户端发送消息?
socket客户端发送消息问题
现在需求是两个客户端和一个服务端,一个客户端向服务端发送消息,然后服务端再将消息发送给第二个客户端,都是长连接,第一次发送没问题,但是再点发送第二个客户端就收不到消息了,服务器也收不到(下面服务端代码) ![![![图片说明](https://img-ask.csdn.net/upload/201508/13/1439451531_552012.png)图片说明](https://img-ask.csdn.net/upload/201508/13/1439451550_766409.png)图片说明](https://img-ask.csdn.net/upload/201508/13/1439451511_334640.png)
socket TCP通讯 客户端一直循环输出welcome 求挑错
1.import java.io.*; import java.net.*; public class Server { public static final int PORT=8888; public static void main(String[] args) throws IOException{ ServerSocket ss=new ServerSocket(PORT); System.out.println(ss); try{ //记录客户端的数量 int count=0; System.out.println("***服务器即将启动,等待客户端的连接***"); //循环监听,等待客户端的连接 while(true){ Socket socket=ss.accept(); //创建新线程 ServerThread serverThread=new ServerThread(socket); //启动线程 serverThread.start(); count++; System.out.println("客户端的数量:"+count); InetAddress address=socket.getInetAddress(); System.out.println("当前客户端的IP:"+address.getHostAddress()); } }catch(IOException e){ e.printStackTrace(); }finally{ ss.close(); } } } 2.import java.io.*; import java.net.*; /* * 服务器线程处理类 */ public class ServerThread extends Thread{ //和本线程相关的socket Socket socket=null; public ServerThread(Socket socket) { this.socket = socket; } //线程执行的操作,响应客户端的请求 @Override public void run() { BufferedReader in=null; PrintWriter out=null; try{ //获取输入输出流 in=new BufferedReader( new InputStreamReader( socket.getInputStream())); String info=null; while((info=in.readLine())!=null){ System.out.println("我是服务器,客户端说"+info); } socket.shutdownInput(); out=new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()))); out.println("welcome!"); out.flush();//调用flush()方法将缓冲输出 }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(in!=null) in.close(); if(out!=null) out.close(); }catch(IOException e){ e.printStackTrace(); } } } } 3.import java.io.*; import java.net.*; /* * 客户端 */ public class Client { public static void main(String[] args)throws IOException { Socket socket=new Socket("localhost",Server.PORT); try{ BufferedReader in=new BufferedReader( new InputStreamReader( socket.getInputStream())); PrintWriter out=new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()))); out.println("用户名:mtone;密码:123"); out.flush(); //flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满 socket.shutdownOutput(); String info=null; info=in.readLine(); while(info!=null){ System.out.println("我是客户端,服务器说:"+info); } }catch(IOException e){ e.printStackTrace(); }finally{ socket.close(); } } } ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510915294_669759.png) ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510915305_978328.png)
java socket通讯 一个服务器连接多个客户端 如何在服务器端给指定的客户端主动发送消息?
java socket通讯 一个服务器连接多个客户端 如何在服务器端给指定的客户端主动发送消息? 新人小白求大神帮帮忙 最好附上代码 真的很急啊
C/C++ socket tcp 发送和接收数据问题
客户端和服务器之间发送的一个数据正常,但当发送第二个数据后便出现了问题。求大神帮忙看一哈: 代码如下: client端: #include <WINSOCK2.H> #include <STDIO.H> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0) { return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sclient == INVALID_SOCKET) { printf("invalid socket !"); return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(1000); serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); /**************************************** int WSA_return; WSADATA WSAData; WSA_return=WSAStartup(0x0101,&WSAData); hostent *host_entry;// 结构指针 char host_name[256] ="manage.dgjgw.cn"; if(WSA_return==0) { host_entry=gethostbyname(host_name);// 即要解析的域名或主机名 printf("%s\n", host_name); if(host_entry!=0) { printf("解析ip地址: "); printf("%s",inet_ntoa(*((struct in_addr*)host_entry->h_addr))); } } serAddr.sin_addr.S_un.S_addr = inet_addr((char*)inet_ntoa(*((struct in_addr*)host_entry->h_addr))); ****************************************/ //接收缓存区 int nRecvBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)); //发送缓冲区 int nSendBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int)); printf("连接中》》》》》》》》》\n"); //连接1 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connect error !\n"); closesocket(sclient); return 0; } else { printf(" connect success !\n"); } //连接2 while (true) { char sendData[10] ={0x05,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33}; char sendData1[2] ={0x05,0x03}; cout<<"请输入指令"<<endl; int a=0; cin>>a; switch(a) { case 1: printf("发送注册消息\n"); send(sclient, sendData, strlen(sendData), 0); break; case 2: printf("发送心跳消息\n"); send(sclient, sendData1, strlen(sendData1), 0); break; default : cout<<"输入错误"<<endl; break; } char recData[2]; memset(recData,0,2); int ret=0; ret = recv(sclient, recData, 2, 0); if(ret > 0) { printf("信息发送成功,回执如下\n"); for(int i=0;i<=ret;i++) { printf("%x",recData[i]); } printf("\n"); } else { printf("信息发送失败,关闭客户端\n"); break; } memset(recData,0,2); closesocket(sclient); } system("pause"); closesocket(sclient); WSACleanup(); return 0; } sever端: //#include "stdafx.h" #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { //初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(sockVersion, &wsaData)!=0) { return 0; } //创建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(slisten == INVALID_SOCKET) { printf("socket error !"); return 0; } //绑定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(1000); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("bind error !"); } //开始监听 if(listen(slisten, 5) == SOCKET_ERROR) { printf("listen error !"); return 0; } //循环接收数据 SOCKET sClient; sockaddr_in remoteAddr; int nAddrlen = sizeof(remoteAddr); char revData[255]; while (true) { printf("等待连接...\n"); sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); if(sClient == INVALID_SOCKET) { printf("accept error !"); continue; } printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); //接收数据 char revData[10]; memset(revData,0,10); int ret= recv(sClient, revData, 10, 0); if(ret > 0) { printf("消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); } else { printf("消息接收失败:\n"); } while(revData[0]==0x05&&revData[1]==0x01&&revData[2]==0x33&&revData[3]==0x33&&revData[4]==0x33 &&revData[5]==0x33&&revData[6]==0x33&&revData[7]==0x33&&revData[8]==0x33&&revData[9]==0x33) { printf("注册消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); char sendData1[2]; sendData1[0]=0x05; sendData1[1]=0x02; send(sClient, sendData1, 2, 0); break; } while(revData[0]==0x05&&revData[1]==0x03) { printf("心跳消息接收成功:\n"); for(int i=0;i<2;i++) { printf("%x",revData[i]); } printf("\n"); char sendData[2]; sendData[0]=0x05; sendData[1]=0x04; send(sClient, sendData, 2, 0); break; } } closesocket(sClient); closesocket(slisten); WSACleanup(); return 0; }
arm板作为tcp客户端无法连接网络摄像头,报错误代码111
1.问题背景 需要将arm用网线连接网络摄像头对其进行控制。厂商只提供了CGI接口,且由于系统是裁剪过的curl这些也用不了,所以尝试使用tcp协议直接封装成http。 2.问题现象 用tcp工具,pc作为客户端连接摄像头,发送可以直接接收到有效返回。但是arm板与tcp测试工具或者摄像头都连不上,报111 客户端代码如下 ``` static protocol_err_t protocol_CameraCommand(PROTOCOL *this) { unsigned short port = 8000; // 服务器的端口号 char *server_ip = "192.168.13.11"; // 服务器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.1"); //服务端接收数据处理文件地址,并带参数 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.13.11"); //服务器地址 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"); 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; } char recv_buf[521]=""; recv(sockfd, recv_buf, sizeof(recv_buf), 0); protocol_SendString(this, "------------------------ server retrun data -------------------------------\n"); sprintf(this->sendBuffer,"%s\n\n",recv_buf); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_NONE; } ```
java Socket 在客户端断开之后才可以接收到客户端发送的消息!
``` //客户端 public class Test { private static boolean is = true; public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket("127.0.0.1", 6677); System.out.println("链接成功"); Scanner scanner = new Scanner(System.in); while (is) { System.out.println("请输入!!!"); int n = scanner.nextInt(); switch (n) { case 1: OutputStream os = socket.getOutputStream(); os.write("hello world".getBytes()); os.flush(); // os.close(); // socket.close(); // IoUtil.IoClose(os); System.out.println("发送成功"); break; case 2: System.out.println("循环关闭"); is = false; break; default: is = false; System.out.println("输入错误---循环关闭"); break; } } } } ``` ``` //服务器端 太多了 就贴一部分 @Override public void run() { MessageThread messageThread = null; InputStream iss = null; InputStreamReader isr = null; BufferedReader br = null; while (is) { try { // 监听 Socket socket = serverSocket.accept(); System.out.println("链接成功"); iss = socket.getInputStream(); isr = new InputStreamReader(iss); br = new BufferedReader(isr); String len; StringBuffer sb = new StringBuffer(); while ((len = br.readLine()) != null) { sb.append(len); } System.out.println(sb.toString()); // iss.close(); // IoUtil.IoClose(br, isr, iss); SocketMap.put(sb.toString(), socket); /** * 开启接受消息的线程 */ messageThread = new MessageThread(socket); messageThread.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); messageThread.setFlag(false); } } ``` 大致代码就这些 问题出在 socket 可以链接成功 但是 客户端发送的消息要等 客户端断开链接之后才能接收到 或者 关闭客户端的输出流也可以! C#为客户端的时候也一样!
socket编程:tcp client端如何获得已经发送出去但是还没有收到对端确认的TCP数据数量
socket编程:tcp client端如何获得已经发送出去但是还没有收到对端确认的TCP数据数量 恳请大神帮忙!
ServerSocket服务端如何向多个Socket客户端发送同一个数据?
利用线程是多个Socket客户端连接到ServerSocket服务端,但是怎么让ServerSocket服务端向所有的客户端发送同一个数据?
tcp socket服务端如何支持wss协议
环境:windows服务器、C# 1、服务器上已有一个web系统,有一个证书,支持https,如网址为:https://api.*****.com 2、服务器还有一个C#编写的tcp socket 服务端软件,监听端口是503.这个服务端支持普通tcp socket连接,也支持web socket, 客户端可通过域名:端口(***:503)也可以通过ws://**.com:503 这2种方式实现连接; 新需求:微信小程序需要通过websocket连接至该tcp socket服务端,但是微信小程序只支持wss协议。 问如何修改tcp socket 的服务端软件,支持wss协议? 例如我再生成一个证书:503.****.com 我想用这个证书作为wss协议使用,但不知道怎么开发了?各位可否提供一些思路就好?谢谢。
客户端和服务端通过建立socket通信,协议是tcp/ip
有一个问题咨询:一个客户端和一个服务端通过tcp/ip连接(之间建立socket通信),在不断网的情况下,服务端关闭,客户端报警,重新开启服务器,客户端能够重新连接上服务端,但是如果拔掉网线,客户端就连接不上服务端了,但从服务端发送过来的数据还是可以读到,可是从客户端发送的数据不能到达服务端,这是为什么???
发送端TCP的发送缓存设置为10K, 接收端接收缓存设置为10K,接收端一直不调用RECV去接收,那么发送端到底能发送出多少数据?
1. 编写TCP server和Client程序 2. server端在accept之前调用setsockopt(slisten, SOL_SOCKET, SO_RCVBUF,(char*)&uiRcvBuf, uiRcvBufLen);将接收缓存设置为10K. 3. cleint端在bind之前调用setsockopt(slisten, SOL_SOCKET, SO_SNDBUF,(char*)&uiSendBuf, uiSendBufLen);将发送缓存设置为10K 4. cleint端调用send函数发送,相关代码如下: ``` int n = 50; char sendData[1024]; int len = sizeof(sendData); printf("sendlen = %u",len); for (int i = 0;i < len; i++) { sendData[i] = 0x01; } while (n) { int iResult = send(sclient, sendData, len, 0 ); if (iResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); getchar(); closesocket(sclient); WSACleanup(); return 1; } n--; printf("Bytes Sent: %d,%d\n", iResult,50-n); } ``` 5. server端不调用recv函数接收 7. wireshark抓包显示如下: ![图片说明](https://img-ask.csdn.net/upload/201912/19/1576743174_639138.jpg) 8. cleint测试端发送了30k数据后停住了(send是阻塞式) **疑问:** 1. wireshark图中为什么在第一个红色框图的时候win才开始变化(win从10240变成7736)?这之前的数据是存在哪里的?不是接收缓存?不应该从接收第一个包开始就开始减少吗? 2. wireshark图中第一个红色框图为什么会有大于20k的数据(ack=21049)? 3. 为什么从wireshark看到server接收了20k多的数据,而不是10k? 4. cleint端为什么能够send出30k数据才停下来?
ubnutu socket实现不同主机通信 客户端链接服务端拒绝链接
客户端 ``` #include<stdlib.h> #include<sys/types.h> #include<stdio.h> #include<sys/socket.h> #include<string.h> #include<arpa/inet.h> #include<unistd.h> #include<errno.h> #include<pthread.h> void sent(int *qian){ int q=*qian; char buff[1024]; int len; while(1){ bzero(buff,1025); fgets(buff,1024,stdin); // len=send(q,buff,30,0); if(len<0){ perror("send "); break; } if(!strncasecmp(buff,"quit",4)){ printf("I will quit!\n"); break; } } close(q); pthread_exit(NULL); } int main(){ int lian,len; char buff[30]; struct sockaddr_in dest; if((lian=socket(AF_INET,SOCK_STREAM,0))<0){ printf("socket error!\n"); return -1; } printf("socket created\n"); bzero(&dest,sizeof(dest)); dest.sin_family=AF_INET; dest.sin_port=htons(8088); inet_aton(("127.0.0.1"),(struct in_addr*)&dest.sin_addr.s_addr); if(connect(lian,(struct sockaddr *)&dest,sizeof(dest))==-1){ perror("connect "); exit(1); } printf("sercer connect\n"); pthread_t sended; pthread_create(&sended,NULL,(void*)sent,&lian); while(1){ bzero(buff,30); len=recv(lian,buff,30,0); if(len<=0){ perror("recv "); break; } else if(len>0)printf("%s\n",buff); else { printf("the other one close,quit\n"); break; } } pthread_join(sended,NULL); //等待sended线程结束之后,主线程才能结束 close(lian); return 0; } ``` 服务端 ``` #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <string.h> #include <signal.h> #include <arpa/inet.h> #include <unistd.h> #include <pthread.h> #include <fcntl.h> #include <time.h> #include<errno.h> int num=0; int new_fd[5]; struct sockaddr_in myaddr,itaddr; void sended(int *qian){ char buf[30]; int len; int q=*qian; char mass[60]; len=sizeof(struct sockaddr); while(1){ if((recv(q,buf,30,0))<=0){ //接收来自客户端的消息 break; } if(strncasecmp(buf,"quit",4)==0){ printf("%d已退出聊天室\n",q); close(q); break; } printf("%d说:%s\n",q,buf); sprintf(mass,"%d说:%s",q,buf); int j=0; for(j=0;j<num;j++){ if(q-4!=j) send(new_fd[j],mass,60,0); } //将某个客户端的信息发送给其它客户端 bzero(buf,30); } printf("接受信息结束!\n"); close(q); pthread_exit(NULL); } void revied(int *qian){ int fd; int q=*qian; while(1){ char buf[1024]; char rizhi[100]; int fang; int len; len=sizeof(struct sockaddr); bzero(buf,1025); time_t t; t=time((time_t *) 0); //得到系统时间 if((fang=accept(q,(struct sockaddr *)&itaddr,&len))<0){ //接收来自客户端的连接申请 printf("accept error!\n"); exit(1); } else printf("server:gor connection from %s ,port %d,socket %d ,time:%s\n",inet_ntoa(itaddr.sin_addr),ntohs(itaddr.sin_port),fang, ctime(&t)); //打印出客户端连接信息 //将信息写入文件 sprintf(rizhi,"the %d user connection from %s ,port %d,socket %d ,time:%s\n",num+1,inet_ntoa(itaddr.sin_addr),ntohs(itaddr.sin_port),fang, ctime(&t)); fd =open("rizhi.txt",O_RDWR|O_CREAT, S_IRWXU); lseek(fd,0,SEEK_END); write(fd,rizhi,strlen(rizhi)); close(fd); new_fd[num]=fang; num++; printf("连接了%d用户\n",num); pthread_t sent; pthread_create(&sent,NULL,(void*)sended,&fang); //线程sended函数 sleep(0.2); } close(q); pthread_exit("线程安全退出!\n"); } int main(){ int i=1; int lian; int pid,len; char buf[1024]; pthread_t revi;//声明线程ID printf("Socket...\n"); lian=socket(AF_INET, SOCK_STREAM, 0); /* 创建套接字完成连接, 第一个参数为地址族,也就是ip地址类型,AF_INET表示地址类型为ipv4 第二个参数为数据传输方式/套接字类型,SOCK_STREAM表示流格式套接字/面向连接的套接字 第三个参数为传输协议,设为0,则系统会自动推演该使用什么传输协议 socket()函数返回文件描述符,唯一标识套接字 */ if(lian<0){ printf("%s\n","socket error!"); exit(1); } printf("Bind...\n"); myaddr.sin_family=AF_INET; myaddr.sin_port=htons(8088); //初始化sockaddr_in结构体参数 //sin_port存储端口号 //htons()将本地字节顺序转换为网络字节顺序 inet_aton(("127.0.0.1"),(struct in_addr*)&myaddr.sin_addr.s_addr); //inet_aton,将一个字符串ip转换为网络序列ip地址 if(bind(lian,(struct sockaddr*)&myaddr,sizeof(myaddr))<0) //bind(),创建本地捆绑 { printf("Bind failed.\n"); exit(1); } printf("listen...\n"); listen(lian,5); //linten()创建套接口并监听申请的连接 pthread_create(&revi,NULL,(void*)revied,&lian); /*建立线程 第一个参数为指向线程标识符的指针 第二和参数设置线程属性 第三个参数为线程运行函数的起始地址 第四个参数为该运行函数的参数 */ while(1){ int j=0; char massage[30]; char ass[60]; scanf("%s",&massage); sprintf(ass,"服务器说:%s",massage); if(strncasecmp("quit",massage,4)==0){ printf("即将退出!\n"); break; } if(num<=0)printf("没有客户端连接!\n"); else{ for(j=0;j<num;j++){ int ss=send(new_fd[j],ass,60,0); } //服务器的自己写的信息发送给客户端 } sleep(0.5); } pthread_join(revi,NULL); //等待revi线程结束之后,主线程才能结束 close(lian); return 0; } ```
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
volatile 与 synchronize 详解
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
GitHub开源史上最大规模中文知识图谱
近日,一直致力于知识图谱研究的 OwnThink 平台在 Github 上开源了史上最大规模 1.4 亿中文知识图谱,其中数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用 csv 格式。 到目前为止,OwnThink 项目开放了对话机器人、知识图谱、语义理解、自然语言处理工具。知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性关系,机器人采用了基于知识图谱的语义感...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
微信支付崩溃了,但是更让马化腾和张小龙崩溃的竟然是……
loonggg读完需要3分钟速读仅需1分钟事件还得还原到昨天晚上,10 月 29 日晚上 20:09-21:14 之间,微信支付发生故障,全国微信支付交易无法正常进行。然...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问