C++ socket 客户端recv不到数据 5C

#include
#include /* for socket() and bind() /
#include /
for printf() and fprintf() /
#include /
for sockaddr_in and inet_ntoa() /
#include /
for close() /
#include /
for memset() /
#include /
for atoi() */

#include "Msg.h"
#include "queue"
#include "pack.h"
#include "analysis.h"
///////////////

using namespace std;
#define MYPORT 7000
#define SERVER_IP "127.0.0.1"

#define BUFFER_SIZE 1024
int sock_cli;//client文件描述符

void* recvMess(void* ptr) {
unsigned char recvbuf[BUFFER_SIZE];
while (1){
memset(recvbuf,0x00, sizeof(recvbuf));
cout<<"ready recv"<<endl;
int len = recv(sock_cli,recvbuf, sizeof(recvbuf),0);
if(len == -1){
cout << " client -1 recv error" << endl;
} else if (len == 0){
cout << "clent 0 recv over" << endl;
} else {
cout << len << endl;
}
}

int main()
{

///定义sockfd
//sock_cli = socket(AF_INET,SOCK_STREAM,0);
sock_cli = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
if(sock_cli <0){
    cout << "socket creatation failed!" << endl;
    return -1;
}
///定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT);  ///服务器端口
servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);  ///服务器ip

if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
    perror("connect");
    exit(1);
}

pthread_t recv_szMessage_thread;
int  recv_szMessage_thread_flag = pthread_create(& recv_szMessage_thread,NULL,recvMess,NULL);
if ( recv_szMessage_thread_flag !=0){
    cout<< "client create recv thread failed"<<endl;
}
pthread_detach( recv_szMessage_thread);

while(1){
}
close(sock_cli);
return 0;

}

3个回答

qq_39588327
oldkeai 我 memset过啊, 打断点 每次到recv这就沉了
一年多之前 回复

当我把 服务端关闭时,就会recv的返回值是0

这种代码网上多得是,你咋出的错呢,是不是服务器那边就没弄好,导致客户端没收到数据?

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

#include <sys/types.h> #include <sys/socket.h>/* for socket() and bind() */ #include <stdio.h>/* for printf() and fprintf() */ #include <arpa/inet.h>/* for sockaddr_in and inet_ntoa() */ #include <unistd.h>/* for close() */ #include <string.h> /* for memset() */ #include <stdlib.h>/* for atoi() */ #include "Msg.h" #include "queue" #include "pack.h" #include "analysis.h" /////////////// using namespace std; #define MYPORT 7000 #define SERVER_IP "127.0.0.1" #define BUFFER_SIZE 1024 int sock_cli;//client文件描述符 void* recvMess(void* ptr) { unsigned char recvbuf[BUFFER_SIZE]; while (1){ memset(recvbuf,0x00, sizeof(recvbuf)); cout<<"ready recv"<<endl; int len = recv(sock_cli,recvbuf, sizeof(recvbuf),0); if(len == -1){ cout << " client -1 recv error" << endl; } else if (len == 0){ cout << "clent 0 recv over" << endl; } else { cout << len << endl; } } int main() { ///定义sockfd //sock_cli = socket(AF_INET,SOCK_STREAM,0); sock_cli = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP); if(sock_cli <0){ cout << "socket creatation failed!" << endl; return -1; } ///定义sockaddr_in struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(MYPORT); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr(SERVER_IP); ///服务器ip if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect"); exit(1); } pthread_t recv_szMessage_thread; int recv_szMessage_thread_flag = pthread_create(& recv_szMessage_thread,NULL,recvMess,NULL); if ( recv_szMessage_thread_flag !=0){ cout<< "client create recv thread failed"<<endl; } pthread_detach( recv_szMessage_thread); while(1){ } close(sock_cli); return 0; }

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

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

完成端口,接收数据不完全,recv返回0

一个项目,使用完成端口,SOCKET的套接字。recv函数返回0。 具体问题是这样的,我能接收大部分数据,但是每次都少了1436个比特。我看了一下,是因为recv返回0。 然后,我看到网上说这个函数,说是连接被关闭了。我又在发送端发送完了之后,调用shutdown,而不是用的closesocket。 接收端部分代码: while (true) { RtlZeroMemory(fileBuf, DATA_BUFSIZE); nlen = recv(perHandleData->socket, fileBuf, DATA_BUFSIZE, 0); fileInfo->file.Write(fileBuf, nlen); fileCount += nlen; if (fileCount >= fileInfo->dwFileSize||nIndex>=10) { break; } if (nlen == 0) { nIndex++; } } ``` ``` 我发送端用的是循环发送,接收端用的是循环接收。接收端跳出有两种情况,全部接受和recv返回了0。其实只要recv返回了一次0的话,就可以直接跳出循环的了。我这里还是用的十次。 而发送端并没有closesocket,只是调用shutdown停止发送。 请问,我接受不全,是什么原因啊?我看到网上说的另一种情况是:recv函数在等待协议接收数据时网络中断了。 具体是什么原因我也不清楚。请哪位大牛帮帮忙! 分不多,麻烦啦

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

关于windows下socket编程的recv函数

Talk is cheap,show me the code. do{ # memset(buf, 0, BUFSIZ); # strLen = recv(reads.fd_array[i], buf, BUFSIZ - 1, 0); if (strLen == 0 || strLen == -1){ FD_CLR(reads.fd_array[i], &reads); closesocket(cpyReads.fd_array[i]); printf("closed client:%d \n", cpyReads.fd_array[i]); } else{ printf("From %d : %s", cpyReads.fd_array[i], buf); //send(reads.fd_array[i], buf, strLen, 0); } # } while (strLen==BUFSIZ-1); 我设置的BUFSIZ 是10 我在调用recv函数来取客户端发过来的数据时,如果收到的数据长度大于我设置的缓冲大小也就是BUFSIZ 比如发过来的是10个字符 , 那么do while 循环会循环两次,如果我发送过来的正好是9个字符 , 为啥只循环了一次呢。我调试看到 strLen 明明等于BUFSIZ-1 的 , 于是在上面的memset处加的断点,才知道确实是循环了两次, 可是执行到 recv函数的时候 整个循环直接跳出来了,不太明白这里,求大神讲解一下,站等。。。

socket编程客户端连接失败

想用socket通信,没法解决客户端连接失败,代码是一本书上的实例,书上的都运行不成功吗,大家帮看下问题在那里,谢谢了![图片说明](https://img-ask.csdn.net/upload/201507/13/1436783188_607205.png) 代码如下: 服务器端:################################################### #include<stdio.h> #include<winsock.h> /*引入winsock头文件*/ int main() { /*-----------------------------------------*/ /*------------定义变量---------------------*/ /*-----------------------------------------*/ char Sendbuf[100]; /*发送数据的缓冲区*/ char Receivebuf[100]; /*接受数据的缓冲区*/ int SendLen; /*发送数据的长度*/ int ReceiveLen; /*接收数据的长度*/ int Length; /*表示SOCKADDR的大小*/ SOCKET socket_server; /*定义服务器套接字*/ SOCKET socket_receive; /*定义用于连接套接字*/ SOCKADDR_IN Server_add; /*服务器地址信息结构*/ SOCKADDR_IN Client_add; /*客户端地址信息结构*/ WORD wVersionRequested; /*字(word):unsigned short*/ WSADATA wsaData; /*库版本信息结构*/ int error; /*表示错误*/ /*-----------------------------------------*/ /*------------初始化套接字库---------------*/ /*-----------------------------------------*/ /*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/ wVersionRequested = MAKEWORD( 2, 2 ); /*加载套接字库,初始化Ws2_32.dll动态链接库*/ error = WSAStartup( wVersionRequested, &wsaData); if(error!=0) { printf("加载套接字失败!"); return 0; /*程序结束*/ } /*判断请求加载的版本号是否符合要求*/ if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); /*不符合,关闭套接字库*/ return 0; /*程序结束*/ } /*-----------------------------------------*/ /*------------设置连接地址-----------------*/ /*-----------------------------------------*/ Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/ Server_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/*主机地址*/ Server_add.sin_port=htons(5000);/*端口号*/ /*------------创建套接字-------------------*/ /*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/ socket_server=socket(AF_INET,SOCK_STREAM,0); /*-----------------------------------------*/ /*---绑定套接字到本地的某个地址和端口上----*/ /*-----------------------------------------*/ /*socket_server为套接字,(SOCKADDR*)&Server_add为服务器地址*/ if(bind(socket_server,(SOCKADDR*)&Server_add,sizeof(SOCKADDR) )==SOCKET_ERROR) { printf("绑定失败\n"); } /*-----------------------------------------*/ /*------------设置套接字为监听状态---------*/ /*-----------------------------------------*/ /*监听状态,为连接做准备,最大等待的数目为5*/ if(listen(socket_server,5)<0) { printf("监听失败\n"); } /*-----------------------------------------*/ /*------------接受连接---------------------*/ /*-----------------------------------------*/ Length=sizeof(SOCKADDR); /*接受客户端的发送请求,等待客户端发送connect请求*/ socket_receive=accept(socket_server,(SOCKADDR*)&Client_add,&Length); if(socket_receive==SOCKET_ERROR) { printf("接受连接失败"); } /*-----------------------------------------*/ /*--------------进行聊天-------------------*/ /*-----------------------------------------*/ while(1) /*无限循环*/ { /*--------接收数据---------*/ ReceiveLen =recv(socket_receive,Receivebuf,100,0); if(ReceiveLen<0) { printf("接收失败\n"); printf("程序退出\n"); break; } else { printf("client say: %s\n",Receivebuf); } /*--------发送数据---------*/ printf("please enter message:"); scanf("%s",Sendbuf); SendLen=send(socket_receive,Sendbuf,100,0); if(SendLen<0) { printf("发送失败\n"); } } /*-----------------------------------------*/ /*---------释放套接字,关闭动态库----------*/ /*-----------------------------------------*/ closesocket(socket_receive); /*释放客户端的套接字资源*/ closesocket(socket_server);/*释放套接字资源*/ WSACleanup();/*关闭动态链接库*/ return 0; } 客户端:##################################################### #include<stdio.h> #include<winsock.h> /*引入winsock头文件*/ int main() { /*-----------------------------------------*/ /*------------定义变量---------------------*/ /*-----------------------------------------*/ char Sendbuf[100]; /*发送数据的缓冲区*/ char Receivebuf[100]; /*接受数据的缓冲区*/ int SendLen; /*发送数据的长度*/ int ReceiveLen; /*接收数据的长度*/ SOCKET socket_send; /*定义套接字*/ SOCKADDR_IN Server_add; /*服务器地址信息结构*/ WORD wVersionRequested; /*字(word):unsigned short*/ WSADATA wsaData; /*库版本信息结构*/ int error; /*表示错误*/ /*-----------------------------------------*/ /*------------初始化套接字库---------------*/ /*-----------------------------------------*/ /*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/ wVersionRequested = MAKEWORD( 2, 2 ); /*加载套接字库,初始化Ws2_32.dll动态链接库*/ error = WSAStartup( wVersionRequested, &wsaData); if(error!=0) { printf("加载套接字失败!"); return 0; /*程序结束*/ } /*判断请求加载的版本号是否符合要求*/ if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); /*不符合,关闭套接字库*/ return 0; /*程序结束*/ } /*-----------------------------------------*/ /*------------设置服务器地址---------------*/ /*-----------------------------------------*/ Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/ /*服务器的地址,将一个点分十进制表示为IP地址,inet_ntoa是将地址转成字符串*/ Server_add.sin_addr.S_un.S_addr = inet_addr("192.168.1.238"); Server_add.sin_port=htons(5000);/*端口号*/ /*-----------------------------------------*/ /*-------------进行连接服务器--------------*/ /*-----------------------------------------*/ /*客户端创建套接字,但是不需要绑定的,只需要和服务器建立起连接就可以了,*/ /*socket_sendr表示的是套接字,Server_add服务器的地址结构*/ socket_send=socket(AF_INET,SOCK_STREAM,0); /*-----------------------------------------*/ /*-------------创建用于连接的套接字--------*/ /*-----------------------------------------*/ /*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/ if(connect(socket_send,(SOCKADDR*)&Server_add,sizeof(SOCKADDR)) == SOCKET_ERROR) { printf("连接失败!\n"); } /*-----------------------------------------*/ /*--------------进行聊天-------------------*/ /*-----------------------------------------*/ while(1) /*无限循环*/ { /*---------------发送数据过程----------*/ printf("please enter message:"); scanf("%s",Sendbuf); SendLen = send(socket_send,Sendbuf,100,0); /*发送数据*/ if(SendLen < 0) { printf("发送失败!\n"); } /*--------------接收数据过程---------------*/ ReceiveLen =recv(socket_send,Receivebuf,100,0); /*接受数据*/ if(ReceiveLen<0) { printf("接收失败\n"); printf("程序退出\n"); break; } else { printf("Server say: %s\n",Receivebuf); } } /*-----------------------------------------*/ /*---------释放套接字,关闭动态库----------*/ /*-----------------------------------------*/ closesocket(socket_send);/*释放套接字资源*/ WSACleanup();/*关闭动态链接库*/ return 0; }

Android作为Socket通信客户端的代码分析

基于Android Studio编写Socket的客户端,与基于Python的Socket服务器进行通信。 这是MainActivity相关代码: ``` import android.annotation.SuppressLint; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.view.View.OnClickListener; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { private TextView result = null; private TextView result2 = null; private static final String HOST = "192.168.80.100"; private static final int PORT = 12345; private Socket socket = null; private BufferedReader bufferedReader = null; private PrintWriter printWriter = null; private String content = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText eturl= findViewById(R.id.eturl); Button btn= findViewById(R.id.btn); result = findViewById(R.id.result); result2 = findViewById(R.id.result2); initSocket(); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String msg; msg = eturl.getText().toString(); if (socket.isConnected()){ if (!socket.isOutputShutdown()){ Toast.makeText(MainActivity.this,"正在发送,请稍等……",Toast.LENGTH_LONG).show(); sendMsg(msg); result.setText("正在连接" + HOST + "\n" + "发送URL" + "\n" + "等待接收检测结果" + "\n"); recv(); } } } }); } public void sendMsg(final String msg){ new Thread(new Runnable() { @Override public void run() { if(socket.isConnected()){ if(!socket.isOutputShutdown()){ printWriter.println(msg); } } } }).start(); } public void initSocket(){ new Thread(new Runnable() { @Override public void run() { try{ socket=new Socket(HOST,PORT); bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); }catch (Exception e){ e.printStackTrace(); } } }).start(); } public void recv(){ new Thread(new Runnable() { @Override public void run() { try{ while (true){ if(socket.isConnected()){ if(!socket.isInputShutdown()){ if((content = bufferedReader.readLine()) != null){ content += "\n"; mhandler.sendMessage(mhandler.obtainMessage()); }else{ } } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } @SuppressLint("HandlerLeak") public Handler mhandler = new Handler(){ public void handleMessage(Message msg) { super.handleMessage(msg); result2.setText(content); } }; } ``` 目前可以正常发送,但接收时有些问题,收不到,安卓客户端没有任何显示。服务器端用另外基于Python的客户端测试过,没问题,应该就是安卓客户端与接收有关的代码可能有问题。 从上面的代码中能看出有什么不妥吗,急求大神指点!!!

python TCP服务端接受数据时recv函数非阻塞究竟如何实现?

这是TCP服务端代码: ``` import socket import threading s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 9998)) s.listen(5) print('Waiting for connection') def tcplink(sock, addr): print('Accept new connection from %s:%s...' % addr) sock.send(b'Welcome!') buffer = [] while True: #接受数据时就卡在这里了 d = sock.recv(1024) if not d: break else: buffer.append(d) sock.send('get it!'.encode('utf-8')) print((b''.join(buffer)).decode('utf-8')) sock.close() print('Connection from %s:%s closed.' % addr) while True: sock, addr = s.accept() t = threading.Thread(target=tcplink, args=(sock, addr)) t.start() ``` 客户端代码: ``` import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.send(b'nihao') buffer = [] while True: d = s.recv(1024) if not d: break else: buffer.append(d) data = b''.join(buffer) s.close() print(data.decode('utf-8')) ``` 上网查了很多方式比如settimeout,MSG_DONTWAIT,都失败了,如何修改代码才能正常接受数据呢?求详细一点的说明,谢谢!

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

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

socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空

结构体定义: typedef struct PriceChangeVar { int varNum; //产品编号 float varPrice; //监控价格 int changeMark; //监控标志 }PriceCV; //客户信息结构体 typedef struct CilentInformation { PriceCV MemPriceCV[10]; //价格需求定制结构体 SYSTEMTIME loginTime; //上线时间 LONGLONG TelephoneNum; //手机号码 ULONG MemIp; //IP地址 ULONG MesageCount; //已发信息数量 wchar_t MemName[512]; //会员名称 int state; //客户请求的状态 int MemType; //会员等级 SOCKET serConn; //服务器accpet链接客户端的套接字 }Cinfo; 服务端代码: Cinfo t_cinfo; int rret = recv(((Cinfo*)lpPrama)->serConn,(char *)&t_cinfo,sizeof(Cinfo),0); //接收到的信息,已经有用户名、会员等级、价格需求结构体、客户状态、手机号码, //需要补充IP、套接字接口、发送时间 wchar_t *t_name = t_cinfo.MemName; int t_type = t_cinfo.MemType; LONGLONG t_tele = t_cinfo.TelephoneNum; int state_temp = t_cinfo.state; 客户端代码: int sret = JSocket::ConnectSocket(LOCALHOST_IP,6000); Cinfo info; memset(&info,0,sizeof(Cinfo)); wcscpy(info.MemName,JGlobal::GetUserName().GetBuffer(0)); info.MemType = JGlobal::GetUserType(); info.state = STATE_LOGIN; info.TelephoneNum = (LONGLONG)12345678910; sret = JSocket::SendVipInformation((char*)&info,sizeof(Cinfo)); 客户端和服务端发送接受都是成功的,返回值与结构体的size一致,发送时赋值也OK,现在就是接受之后结构体内部所有值为0,求有经验的前辈指点

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

socket编程多线程如何处理客户端不同请求

我现在在服务端想采用多线程处理客户端的连接,发消息,收消息,更新客户列表, 但是我是如何才能知道客户端想要干什么呢? 这个别人的代码 ,他是通过switch判断的,我现在想明白如何实现这个switch过程,控制台程序。 希望大佬回答详细点 ,初如编程很多不明白![图片说明](https://img-ask.csdn.net/upload/201708/01/1501555996_986604.png)

VC socket编程,数据接收问题

用VC socket编程时,用recv函数接收字符串数据,只能接收到前4个字符,多于4个字符的都是“烫”字乱码。这是什么问题?怎么解决? char cs[100]; case FD_READ: { CString num=""; //定义字符串,用于保存待显示字符 ::recv(s1,cs,strlen(cs),0); //接收来自客户端的字符串数据 GetDlgItem(IDC_TEXT)->GetWindowText(num); //获取消息显示框中原有的字符 num+="\r\n"; //添加换行符 num+=(LPTSTR)::inet_ntoa(add1.sin_addr); //将客户端IP换成字符串 num+=":\r\n"; //添加换行符 num+=(LPTSTR)cs; //将接收到的字符串添加到显示字符串 num+=":\r\n"; //添加换行符 GetDlgItem(IDC_TEXT)->SetWindowText(num); //将字符串显示到消息显示框 }

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

C++服务端发送给客户端消息,但客户端没有显示

服务端代码: #include"iostream" #include<winsock2.h> #pragma comment(lib,"ws2_32") #include<stdlib.h> using namespace std; int main() { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in sockaddr; sockaddr.sin_family = PF_INET; sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sockaddr.sin_port = htons(827); bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR)); listen(s, 1); SOCKADDR clientAddr; int nSize = sizeof(SOCKADDR); SOCKET clientSock; clientSock = accept(s, (SOCKADDR*)&clientAddr, &nSize); send(clientSock, "helllo client \r\n", strlen("hello client \r\n") + sizeof(char), NULL); closesocket(clientSock); closesocket(s); WSACleanup(); return 0; } 客户端代码: #include"iostream" #include<stdlib.h> #include<winsock2.h> #pragma comment(lib,"ws2_32") using namespace std; int main() { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET s = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP); sockaddr_in sockAddr; sockAddr.sin_family = PF_INET; sockAddr.sin_addr.S_un.S_addr = inet_addr("127,0,0,1"); sockAddr.sin_port = htons(827); connect(s, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); char szBuffer[MAXBYTE] = { 0 }; recv(s, szBuffer, MAXBYTE, NULL); printf("szBuffer=%s\r\n", szBuffer); closesocket(s); WSACleanup(); return 0; }

请问一下,c++ socket接收到数据长度和实际不一致

![图片说明](https://img-ask.csdn.net/upload/201902/24/1550993325_415320.png) ![图片说明](https://img-ask.csdn.net/upload/201902/24/1550993333_995105.png) 如图所示,图一未返回的接收到的字节长度20,但是实际上revData里面的数据为"1234",请问这是什么原因?

关于把socket数据写入数据库的问题

我的思路是这样的,之前的想法是:把接收过来的socket数据,充当sql的字段属性变量,来实现数据写入功能。但是几经波折,发现难题攻克不了。现在,我换了另外一种思路:事先把数据库的插入数据命令写在socket里面,到了python直接执行接收到的插入命令就完成写入的操作。具体代码如下:运行没有报错,但是写入也不成功。求各路大神指导一下(Ps: 然后,我发送:"""INSERT money(name,account, saving, expend, income) VALUES ('aaa', '111', '222', '222', '2000')""" 这段数据,python就写入数据。 ) import socket import time import pymysql host = '' port = 80 bufsize = 1024 addr = (host, port) # host设定为空,表示可以与任何ip的socket在端口51423通信 # 设置socket,AF_INET表示是IPV4标准,SOCK_STREAM是TCP传输协议 tcpSerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpSerSock.bind(addr) tcpSerSock.listen(1) quit = False shutdown = False while True: print('等待数据中...') tcpCliSock, addr = tcpSerSock.accept() # 不断监听获取新的客户端连接 print('数据来自:', addr) db = pymysql.connect("localhost", "root", "000000", "money")#连接数据库 cursor = db.cursor()#获取光标 while True: # 与客户端建立连接之后,获取客户端传来的数据 data = tcpCliSock.recv(bufsize) data = data.decode('gbk') sql = data #把接收到的数据(已经写好的插入命令模板)复制给sql try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: db.rollback() if not sql: break ss = '[%s] %s' % (time.ctime(), data) tcpCliSock.sendall(ss.encode('gbk')) print(ss) if data == 'bye': quit = True break elif data == 'shutdown': shutdown = True break print('Bye-bye:[%s:%d]' % (addr[0], addr[1])) tcpCliSock.close() if shutdown: break tcpSerSock.close() print('Server has been closed') ``` ```

C++ Linux网络编程,超简单的例子,就是不知道什么原因,客户端收不到消息

综述:就是客户端和服务端的一次通信,但是总也运行不到预期的结果,运行结果见最后 服务端:做一件事:接受客户端的TCP链接后,向客户端发送一个字符串,但是总在发送的地方返回值为0.求解。。。。 ``` #include<iostream> #include<netinet/in.h> #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<string.h> #include<time.h> using namespace std; int main(int argc,char* argv[]) { int listenfd,confd; sockaddr_in recaddr; char receiveline[100]="I have received the msg\r\n"; listenfd = socket(PF_INET,SOCK_STREAM,0); if(listenfd<0) { cout<<"error socket"<<endl; return 0 ; } bzero(&recaddr,sizeof(recaddr)); recaddr.sin_family = PF_INET; recaddr.sin_addr.s_addr = INADDR_ANY; recaddr.sin_port = htons(7999); if(bind(listenfd,(sockaddr*)&recaddr,sizeof(recaddr))<0) { cout<<"bind error"<<endl; return 0; } if(listen(listenfd,20)<0) { cout<<"listen error"<<endl; return 0; } for(;;) { if(confd = accept(listenfd,(sockaddr*)NULL,NULL)<=0) { cout<<"connect error"<<endl; return 0; } cout<<receiveline<<endl; if(send(confd,receiveline,strlen(receiveline),0)<0) { **//每次都会走到这里面来,不知道为什么这个地方发送的数据为0** cout<<"send empty msg"<<endl; return 0; } if(close(confd)<0) { cout<<"faile to close socket"<<endl; return 0; } } cout<<"end of program"<<endl; return 0; } ``` 客户端: ``` #include<iostream> #include<netinet/in.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> using namespace std; int main(int argc,char* argv[]) { if(argc!=2) { cout<<"wrong input"<<endl; return 0; } int sendfd,n; sockaddr_in addr; bzero(&addr,sizeof(addr)); sendfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); if(sendfd<0) { cout<<"error in socket"<<endl; return 0; } addr.sin_family = PF_INET; addr.sin_port = htons(7999); addr.sin_addr.s_addr= inet_addr("127.0.0.1"); cout<<"ready to connect"<<sendfd<<endl; if(connect(sendfd,(sockaddr*)&addr,sizeof(addr)) < 0) { cout<<"connecting fail"<<endl; return 0; } cout<<"ready to read:"<<sendfd<<endl; char receiveline[100] = {0}; while( (n = recv(sendfd,receiveline,100,0)) > 0 ) { cout<<"n:"<<n<<endl; receiveline[n] = 0; if(fputs(receiveline,stdout)==EOF) { cout<<"error"<<endl; return 0; } } if(n<0) {cout<<"error"<<endl;} cout<<"end of program"<<endl; return 0; } ``` 目前程序的输出为: 服务端: [joker@localhost serv]$ ./SocketServ I have received the msg send empty msg 客户端: [joker@localhost cli]$ ./SocketCli 127.0.0.1 ready to connect3 ready to read:3 end of program 这问题搞了我两天了,求大侠们解。。。

用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==

``` //服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<malloc.h> #define MAXBUF 1024 int main() { int pid; int sockfd,new_fd; socklen_t len; struct sockaddr_in my_addr, their_addr; unsigned int myport,listnum; char buf[MAXBUF+1]; myport=7575; listnum=5; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socker"); exit(EXIT_FAILURE); } memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(myport); my_addr.sin_addr.s_addr=inet_addr("192.168.1.106"); if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){ perror("bind"); exit(EXIT_FAILURE); } if(listen(sockfd,listnum)==-1){ perror("listen"); exit(EXIT_FAILURE); } printf("wait for connect\n"); len=sizeof(struct sockaddr); if(new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&len)==-1){ perror("accept"); exit(EXIT_FAILURE); } else printf("server:got conection!"); if((pid=fork())==-1){ perror("fork"); exit(EXIT_FAILURE); } else if(pid==0){ while(1){ memset(buf,0,sizeof(buf)); fgets(buf,MAXBUF,stdin); if(!strncasecmp(buf,"quit",4)){ printf("i will close the connection"); break; } len=send(new_fd,buf,strlen(buf)-1,0); if(len<0){ printf("message send failed!"); break; } } } else{ while(1){ bzero(buf,MAXBUF+1); len=recv(new_fd,buf,MAXBUF,0); if(len>0) printf("message recv successful:%s \n",buf); else if(len<0){ printf("recv failed!"); break; } else{ printf("the other one close quit \n"); break; } } } close(new_fd); close(sockfd); return 0; } //客户端的代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<errno.h> #include<netinet/in.h> #include<resolv.h> #include<unistd.h> #include<arpa/inet.h> #define MAXBUF 1024 int main() { int sockfd,len,destport=7575; struct sockaddr_in dest; char buf[MAXBUF+1]; if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){ perror("socket"); exit(errno); } printf("socket created\n"); memset(&dest,0,sizeof(dest)); dest.sin_family=AF_INET; dest.sin_port=htons(destport); dest.sin_addr.s_addr=inet_addr("192.168.1.106"); if((connect(sockfd,(struct sockaddr *)&dest,sizeof(dest)))==-1){ perror("connect"); exit(errno); } printf("server connected!\n"); pid_t pid; if((pid=fork())==-1){ perror("fork"); exit(errno); } else if(pid==0){ while(1){ memset(buf,0,sizeof(buf)); len=recv(sockfd,buf,MAXBUF,0); if(len>0) printf("recv successful:%s \n",buf); else if(len<0){ perror("recv"); exit(errno); } else{ printf("the other one close ,quit\n"); break; } } } else{ while(1){ memset(buf,0,sizeof(buf)); printf("pls send message to send:"); fgets(buf,MAXBUF,stdin); if(!strncasecmp(buf,"quit",4)){ printf("i will quit\n"); break; } len=send(sockfd,buf,strlen(buf)-1,0); if(len<0){ perror("send"); break; } } } close(sockfd); return 0; } ``` 运行客户端和服务器端后,服务器端: ![服务器端](https://img-ask.csdn.net/upload/201504/12/1428817840_417628.png) ****************************************************************** 客户端:![客户端](https://img-ask.csdn.net/upload/201504/12/1428817909_132991.png) 不知道这是什么情况呢,==

c++的socket编程,无客户端连接accept却不阻塞,直接返回了,怎么解决

以下是服务端的代码: ``` #include "stdafx.h" #include "winsock2.h" #include "iostream" #pragma comment (lib,"ws2_32") using namespace std; int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(2, 2), &wsadata); cout << "开始创建套接字\n"; SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in saddrin; saddrin.sin_addr.S_un.S_addr = inet_addr("INADDR_ANY"); saddrin.sin_port = htons(9100); cout << "开始绑定\n"; bind(s, (sockaddr *)&saddrin, sizeof(saddrin)); cout << "开始监听\n"; listen(s, SOMAXCONN); struct sockaddr_in sClient; int num = sizeof(sClient); SOCKET client= accept(s, (sockaddr *)&sClient, &num); if (client) { cout << "已接受来自客户端的连接\n"; cout << sClient.sin_port<<'\n'; cout<< inet_ntoa(sClient.sin_addr)<<'\n'; char msg[MAXBYTE] = { 0 }; recv(client, msg, sizeof(msg), 0); cout << msg; strcpy_s(msg, "this is a reply for the test\n"); send(client, msg, strlen(msg) + sizeof(char), 0); cout << "已发送消息\n"; } else { cout << "无客户端的连接"; } system("PAUSE"); return 0; } ``` 运行结果如下: ![图片说明](https://img-ask.csdn.net/upload/201603/05/1457150555_147664.png) 启动了服务端,客户端都没启动,就直接执行完返回了,accept那里不是应该阻塞,等待客户端的连接的吗?即使同时启动客户端和服务端也是这样的结果,请问应该怎么解决?

学Python后到底能干什么?网友:我太难了

感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越老牌霸主Java,过去几年间Python一直都被寄予厚望。但是事实是虽然上升趋势,但是国内环境下,一时间是无法马上就超越Java的,也可以换句话说:超越Java只是时间问题罢。 太嚣张了会Python的人!找工作拿高薪这么简单? https://edu....

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

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

为什么程序猿都不愿意去外包?

分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助

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

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

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

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

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

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

用python打开电脑摄像头,并把图像传回qq邮箱【Pyinstaller打包】

前言: 如何悄悄的打开朋友的摄像头,看看她最近过的怎么样,嘿嘿!这次让我带你们来实现这个功能。 注: 这个程序仅限在朋友之间开玩笑,别去搞什么违法的事情哦。 代码 发送邮件 使用python内置的email模块即可完成。导入相应的代码封装为一个send函数,顺便导入需要导入的包 注: 下面的代码有三处要修改的地方,两处写的qq邮箱地址,还有一处写的qq邮箱授权码,不知道qq邮箱授权码的可以去百度一...

做了5年运维,靠着这份监控知识体系,我从3K变成了40K

从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维一步步到40K的,甚至笑着说:我现在感觉自己什么都能做。 既然讲,就讲最重要的吧。 监控是整个运维乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供详实的数据用于追查定位问题。目前业界有很多不错的开源产品可供选择。选择一款开源的监控系统,是一个省时省力、效率最高的方...

C++(继承):19---虚基类与虚继承(virtual)

一、菱形继承 在介绍虚继承之前介绍一下菱形继承 概念:A作为基类,B和C都继承与A。最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:在D中会保存两份A的内容 访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此在访问某些成员的时候会发生二义性 缺点的解决: 数据冗余:通过下面“虚继承”技术来解决(见下) 访问...

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

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

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

数据结构与算法思维导图

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

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

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

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

和黑客斗争的 6 天!

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

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

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

win10暴力查看wifi密码

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

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

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

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

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

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

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

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

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

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

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

女朋友过生日,我花了20分钟给她写了一个代理服务器

女朋友说:“看你最近挺辛苦的,我送你一个礼物吧。你看看想要什么,我来准备。” 我想了半天,从书到鞋子到电子产品最后到生活用品,感觉自己什么都不缺,然后和她说:“你省省钱吧,我什么都不需要。” 她坚持要送:“不行,你一定要说一个礼物,我想送你东西了。” 于是,我认真了起来,拿起手机,上淘宝逛了几分钟,但还是没能想出来缺点什么,最后实在没办法了:“这样吧,如果你实在想送东西,那你就写一个代理服务器吧”...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

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

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

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

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

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

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

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

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

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

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

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

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

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

立即提问
相关内容推荐