在C++ socket中为啥这条语句不通过 5C

#include
#include"winsock2.h"
#pragma comment(lib,"ws2_32.lib")
#include
using namespace std;
int main(int argc, char* argv[] )
{
const int BUF_SIZE = 64;
WSADATA wsd;
SOCKET sServer;
SOCKET sClient;
//SOCKADDR_IN serverAddr;

struct socketaddr_in serverAddr;

}
最后一句报错,但是换成上一句注释掉的,就没有问题
请大神解答

6个回答

struct socketaddr_in serverAddr;
这是c语言的写法,而不是c++的写法。

如果非要那么写,需要用typedef将struct socketaddr_in再定义socketaddr_in成

struct socketaddr_in serverAddr; 不是变量声明,而是结构体定义,而且是不完整的定义。

SOCKADDR_IN serverAddr;
是在winsock中封装的,不知道它的底层是不是调用的struct sockaddr_in.这应该就是为什么你会出错的原因吧

typedef struct sockaddr_in {
·......
} SOCKADDR_IN, *PSOCKADDR_IN;

最后一句改成 struct sockaddr_in serverAddr;
在vs2015上测试,编译通过。

struct 是定义结构体

在winsock2.h中有如下定义
typedef struct sockaddr_in SOCKADDR_IN;
所以你注释掉那行是正确的。系统写的肯定没错。系统这么做是为了兼容C和C++。
你自己那行,把struct去掉也是对的。因为C++里面struct已经和class 等价了,声明变量的时候不需要struct关键字。
socketaddr_in serverAddr

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

#include<string.h> #include"winsock2.h" #pragma comment(lib,"ws2_32.lib") #include<iostream> using namespace std; int main(int argc, char* argv[] ) { const int BUF_SIZE = 64; WSADATA wsd; SOCKET sServer; SOCKET sClient; //SOCKADDR_IN serverAddr; struct socketaddr_in serverAddr; } 最后一句报错,但是换成上一句注释掉的,就没有问题 请大神解答

C语言socket建立的简单文件传输问题

# 客户端发送文件 #include<stdio.h> #include<sys/stat.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<fcntl.h> #include<string.h> int main(int argc,char **argv) { ssize_t i=1; char buf[512]; int fp; int ret; int socket_client; struct sockaddr_in addr_in; socket_client = socket(AF_INET,SOCK_STREAM,0);//创建套接字 if(socket_client<0){ perror("socket err"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9001); addr_in.sin_addr.s_addr = inet_addr("192.168.1.77"); ret = connect(socket_client,(struct sockaddr *)&addr_in,sizeof(addr_in));//链接 if(ret<0){ perror("connect err"); return -2; } scanf("%s",buf);//写入文件名 ret = send(socket_client,&buf,sizeof(buf),0);//发送文件名 if(ret<0){ perror("send err"); return -11; } fp = open(buf,O_RDONLY);//打开要发送的文件 if(fp<0){ fprintf(stderr,"open err\n"); return -1; } while(1){ if(i==0){ break; } memset(buf,0,sizeof(buf));//空间清0 i = read(fp,buf,sizeof(buf));//读文件到buf if(i<0){ perror("read err"); return -7; }else if(i==0){ break; } printf("%s\n",buf);//打印一遍用于观察 ret = send(socket_client,buf,sizeof(buf),0);//发送读取到的内容 if(ret<0){ perror("send err"); return -8; } printf("%d\n",ret);//打印发送的大小 sleep(1); } close(socket_client); return 0; } ## 服务器接收文件 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/stat.h> #include<arpa/inet.h> #include<unistd.h> #include<string.h> #include<stdlib.h> #include<fcntl.h> int main(int aegc,char **argv) { char buf[512]; ssize_t i; int fp; int ret; int socket_sever; int socket_client; struct sockaddr_in addr_in; socket_sever = socket(AF_INET,SOCK_STREAM,0);//定义socket套接字 if(socket_sever<0){ perror("socket err"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9001); addr_in.sin_addr.s_addr = inet_addr("192.168.1.77"); ret = bind(socket_sever,(struct sockaddr *)&addr_in,sizeof(addr_in));//绑定 if(ret<0){ perror("bind err"); return -2; } ret = listen(socket_sever,5);//监听 if(ret<0){ perror("listen err"); return -3; } socket_client = accept(socket_sever,NULL,NULL);//建立链接 if(socket_client<0){ perror("accept err"); return -4; } ret = recv(socket_client,&buf,sizeof(buf),0);//接收文件明 if(ret<0){ perror("recv err"); return -6; } fp = open(buf,O_WRONLY | O_CREAT | O_APPEND,0644);//创建并打开文件 if(fp<0){ fprintf(stderr,"open err"); return -1; } while(1){ if(i==0){ break; } memset(buf,0,sizeof(buf));//接收空间清0 ret = recv(socket_client,buf,sizeof(buf),0);//接收 if(ret<0){ perror("recv err"); return -6; }else if(ret==0){ break; } printf("%s\n",buf);//打印一遍用于观察 i = write(fp,buf,sizeof(buf));//写入打开的文件 if(i<0){ perror("write err"); return -13; }else if(i==0){ break;} sleep(1); } close(socket_sever); close(socket_client); } 问题出现在写入完成后末尾出现连续的^@^@^@^@^@^@^@^@符号,占用空间

c++和c语言socket的区别

之前学了c语言socket,现在想用c++写个MFC通信,过程中发现不知道自己是在用c语言还是c++,而且网上的c++通信好杂,有的用CSOCKET,有的用CREATE创建套接字,有的Send大写,有的send小写,还有recv和大写的Receive,我完全混了,搞不清哪个是用c++语言开发的,还有头文件也不同,有的是winsock2,有的是afxsocket。。。求解答

C语言中SOCKET编译不了

``` #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib" void main() { //main开头 int ret; WSADATA wsaData; ret = WSAStartup(0x11,&wsaData); if(ret == SOCKET_ERROR) { perror("failed to start up"); return; } SOCKET server; } ``` 编译出来提示错误 1 error C2275: “SOCKET”: 将此类型用作表达式非法

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

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

windows下C语言编写socket出现连接失败,怎么解决

服务器: ``` #include<stdio.h> #include<errno.h> #include<WinSock2.h> #pragma comment (lib,"Ws2_32.lib") void printerro() { printf("erro %d :", errno); printf("%s\n", strerror(errno)); getchar(); } int main() { int binded, rec, listened; SOCKET sockser, sockcli; struct sockaddr_in seraddr; struct sockaddr_in cliaddr; WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) { return 0; } sockser = socket(AF_INET, SOCK_STREAM, 0); if (sockser == -1) { printf("socket erro\n"); printerro(); exit(1); } else printf("socket ok...\n"); seraddr.sin_family = AF_INET; seraddr.sin_port = htons(600); seraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); binded=bind(sockser, (struct sockaddr*)&seraddr, sizeof(seraddr)); if (binded == SOCKET_ERROR) { printf("binded erro\n"); printerro(); exit(1); } else printf("binded ok...\n"); listened = listen(sockser, 5); if (listened == SOCKET_ERROR) { printf("listen erro\n"); printerro(); exit(1); } else printf("listen ok...\n"); char str[100]; int len = sizeof(seraddr); while (1) { printf("waiting to link.....\n"); sockcli = accept(sockser, (struct sockaddr*)&cliaddr, &len); if (sockcli == INVALID_SOCKET) { printf("accept errp\n"); printerro(); continue; } else //printf("accepted=%d\n", sockcli); puts("连接成功...."); rec = recv(sockcli, str, 100, 0); printf("rec=%d\n", rec); puts(str); close(sockcli); } puts("OVER!\n"); getchar(); return 0; } ``` 客户端: ``` #include<stdio.h> #include<WinSock2.h> #include <errno.h> #pragma comment(lib,"ws2_32.lib") void printerro() { printf("erro %d :", errno); printf("%s\n", strerror(errno)); } int main() { WORD sockVersion = MAKEWORD(2, 2); WSADATA data; if (WSAStartup(sockVersion, &data) != 0) { return 0; } SOCKET sockcli; struct sockaddr_in addrser; sockcli = socket(AF_INET, SOCK_STREAM, 0); if (sockcli == -1) { printf("socket erro\n"); printerro(); exit(1); } else printf("socket ok...\n"); addrser.sin_family = AF_INET; addrser.sin_port = htons(600); addrser.sin_addr.S_un.S_addr = inet_addr("124.93.196.14"); if (connect(sockcli, (struct sockaddr*)&addrser, sizeof(addrser)) == SOCKET_ERROR) { printf("connect erro\n"); printerro(); } else printf("connect ok...\n"); char message[] = "hello !I am kehuduan."; if (send(sockcli, message, strlen(message) + 1, 0) == SOCKET_ERROR) { printf("send erro\n"); printerro(); } else printf("send ok..\n"); closesocket(sockcli); WSACleanup(); getchar(); return 0; } ``` 运行后结果为: (左侧为服务器,右侧为客户端) ![图片说明](https://img-ask.csdn.net/upload/201608/25/1472125587_428038.png) 请问各位,我这个哪里出错了。为什么?怎么解决?(注:我是用VS2015编译的)

c语言使用socket发送图片文件大小正确,但是无法打开是怎么回事?

使用c语言socket通信写了一个客户端与服务器,然后客户端向服务器发送文件,服务器接收。使用自己定义的数据包协议,服务器使用单线程epoll。最后测试时,文本文件发送没有问题,但是发送图片文件,最后图片的大小没有问题,但是无法打开,提示错误:分析 JPEG 图像文件时出错(Improper call to JPEG library in state 201) 。 文件的操作使用linux下系统调用read,write,open 。请问问题可能出现在哪里?

linux c语言 socket编程 recv每次收到一样的数据

#include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <netdb.h> int main() { int so=socket(AF_INET,SOCK_STREAM,0),r; sockaddr_in addr; hostent *hp; hp=gethostbyname("www.csdn.net"); addr.sin_addr.s_addr=*((unsigned long*)hp->h_addr); addr.sin_family=AF_INET; addr.sin_port=htons(80); connect(so,(sockaddr*)&addr,sizeof(sockaddr)); char message[200]="GET / HTTP/1.0\r\nHost:www.csdn.net\r\n\r\n"; send(so,message,strlen(message)+1,0); char buf[1024]={0}; while(recv(so,buf,1024,MSG_PEEK)){ puts(buf); memset(buf,0,1024); } } 就这样一直收不完,请问为什么 谢谢

C语言UDP SOCKET编程求助

本人初入计算机网络,最近在编写一个简单的UDP模型,主要功能是1.Server先开启监听 2.Client用sendto发送一条信息 3.Server用recvfrom接收 4.再用sendto回复 5.Client用recvfrom接收 参考了一些例子,但是从第四步开始总出错,ERRNO为97(#define EAFNOSUPPORT 97 /* Address family not supported by protocol */)在网上搜索无果,希望有经验的朋友们帮助一下我,十分谢谢!!! 我用C语言在UBUNTU18.10下实现。 以下是代码及运行结果: ``` UDPServer.c #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define PORT 8004 //远端地址端口号 void main(void) { int serverSocket,peerlen,buflen; char buf[200]; struct sockaddr_in local_addr,addr_from; if(-1==(serverSocket=socket(AF_INET,SOCK_DGRAM,0))) puts("socket开启失败"); else puts("socket开启成功"); bzero(&local_addr, sizeof(local_addr));//清空字节 local_addr.sin_family = AF_INET; local_addr.sin_port = htons(PORT); local_addr.sin_addr.s_addr =INADDR_ANY;//s_addr到底是个什么类型? //inet_addr是一个计算机函数,功能是将一个点分十进制的IP //转换成一个长整数型数(u_long类型)等同于inet_addr()。 if(bind(serverSocket,(struct sockaddr*)&local_addr, sizeof(local_addr))==-1) printf("%s\n","绑定失败"); else printf("%s\n","绑定成功"); if(-1==(buflen=recvfrom(serverSocket,buf,strlen(buf),0,(struct sockaddr *)&addr_from,&peerlen))) puts("接受失败\n"); else puts("接受成功\n"); puts(buf); if(-1==(int)sendto(serverSocket,"REC",strlen("REC"),0, (struct sockaddr *)&addr_from,sizeof(addr_from))) puts("发送失败\n"); else puts("发送成功\n"); close(serverSocket); printf("%d",errno); } UDPClient.c #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define PORT 8004 //远端地址端口号 void main(void) { int clientSocket,buflen,addrlen,peerlen; char addr[]="10.14.21.68",buf[200]; struct sockaddr_in remoteaddr,addr_from; if(-1==(clientSocket=socket(AF_INET,SOCK_DGRAM,0))) puts("socket开启失败"); else puts("socket开启成功"); bzero(&remoteaddr, sizeof(remoteaddr));//清空字节 remoteaddr.sin_family = AF_INET; remoteaddr.sin_port = htons(PORT); remoteaddr.sin_addr.s_addr =inet_addr(addr); if(-1==(sendto(clientSocket,"HI",strlen("HI"),0, (struct sockaddr *)&remoteaddr,addrlen=sizeof(remoteaddr)))) puts("发送失败\n"); else puts("发送成功\n"); if(-1==(buflen=recvfrom(clientSocket,buf,sizeof(buf),0, (struct sockaddr *)&remoteaddr,&addrlen))) puts("接受失败\n"); else puts("接受成功\n"); puts(buf); close(clientSocket); } 运行结果 Server: socket开启成功 绑定成功 接受成功 HI3Z� 发送失败 97 Client: socket开启成功 发送成功 ```

java socket为啥不阻塞

## package pack1; ## import java.io.*; ## import java.net.ServerSocket;i ## mport java.net.Socket; ## public class Servers { public static void main(String[] args) { ## // TODO Auto-generated method stub ## try { ## ServerSocket s=new ServerSocket(8888); ## while (true) { ## Socket s1=s.accept(); ## InputStream os=s1.getInputStream(); ## byte [] rece=new byte["nihao".getBytes().length]; ## os.read(rece); ## String msg=new String(rece); ## System.out.println(msg); ## s1.close(); } } catch (Exception e) { // TODO: handle exception} }} ## # 这段程序当运行时,客户端不连接,为啥还输出乱码字符呢??请明白人解释下 Socket s1=s。accept(); 不是阻塞函数吗?客户端没有连接,为啥往下执行呢

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

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

C语言Socket编程如何获取所访问网页中的所有网络请求

现在只实现了可以获取到网页的源代码,但想获取的是指定网页中的部分网络请求,像是加载该网页用到的所有图片的URL。

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 c socket编程 1、recv接收不完整 2、有些网站不能打开

小白刚接触socket编程,很多没搞清的地方。 我用如下代码 ``` #include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <netdb.h> int main() { int so=socket(AF_INET,SOCK_STREAM,0),r; sockaddr_in addr; hostent *hp; hp=gethostbyname("www.csdn.net"); addr.sin_addr.s_addr=*((unsigned long*)hp->h_addr); addr.sin_family=AF_INET; addr.sin_port=htons(80); connect(so,(sockaddr*)&addr,sizeof(sockaddr)); char message[200]="GET / HTTP/1.0\r\nHost:www.csdn.net\r\n\r\n"; send(so,message,strlen(message)+1,0); char buf[20000]={0}; r=recv(so,buf,20000,MSG_PEEK); printf("r %d\n%s",r,buf); } ``` 1、看见recv返回的只有1400,所以buf没有把完整的网页源代码记录下来,只有一部分,请问为什么 2、如果换一个网站,比如www.stateair.net,会出现404错误,但浏览器就可以打开,请问为什么 谢谢

java和c使用socket通信时,发送报文的问题

问题详细描述:java是客户端,c语言是服务端。程序的目的是java发送报文过去 ,服务器能够识别。但是c语言写的服务端是很多年前的,目前已经无法对服务端作任何修改,c接收报文是用char定义的,报文是定长报文,不够的用空格补全,格式为包头+报文长度+报文内容(1字节+4字节+300字节),包头是6,报文长度是0300,报文内容由下图的结构体定义。![图片说明](https://img-ask.csdn.net/upload/201912/23/1577087403_15537.png)java使用getBytes()方法,获取了字节数组,发送过去后服务端报错,报错信息为包头错误,后来发现那边接收的是6对应ASCII码,请问这应该如何解决呢?java测试代码如下 ``` package Demo01; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class send { public static void main(String[] args) { try { iSend("172.33.xx.xx",10000); } catch (IOException e) { e.printStackTrace(); } } public static void iSend(String IP,int PORT) throws IOException{ String baotou = "6"; String blen= "0300"; String id = "0001"; String sysid = "1111"; String sysname = "disk"; String type = "11"; String level = "1"; String content = "sendcontent"; Socket socket = null; BufferedOutputStream bos = null; String message = "" ; List <Object> messList = new ArrayList(); messList.add(baotou); messList.add(blen); messList.add(id); messList.add(sysid); messList.add(sysname); messList.add(type); messList.add(level); messList.add(content); List <Object> messList2 = new ArrayList(); messList2.add(changeString(messList.get(0).toString(),1)); messList2.add(changeString(messList.get(1).toString(),4)); messList2.add(changeString(messList.get(2).toString(),4)); messList2.add(changeString(messList.get(3).toString(),8)); messList2.add(changeString(messList.get(4).toString(),16)); messList2.add(changeString(messList.get(5).toString(),16)); messList2.add(changeString(messList.get(6).toString(),16)); messList2.add(changeString(messList.get(7).toString(),240)); for(Iterator<Object> it = messList2.iterator();it.hasNext();){ message += it.next(); } System.out.println("报文为:"+message); try { socket = new Socket(IP,PORT); bos = new BufferedOutputStream(socket.getOutputStream()); byte [] buf = message.getBytes(); bos.write(buf,0,buf.length); bos.flush(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(socket != null){ socket.close(); } } } /** * *设置定长报文,用空格补齐 * @param object 报文集合 * @param len 报文的规定长度 * @return */ public static String changeString(String list,int len){ for(int ListLen = list.length();ListLen < len;ListLen++){ list +=" "; } return list; } } ```

安卓 Socket通信,Socket连接不上,程序就在真机崩溃但在模拟器上正常

class ReceiveData extends Thread { int i=1; private void reconnect( ) { Log.i("第"+i+"次连接","reconnect刚开始执行"); try { Log.i("第"+i+"次连接","Socket之前"); Socket s=new Socket("192.168.0.103",40011); Log.i("第"+i+"次连接","Socket之后"); InputStream ins=s.getInputStream(); Log.i("第"+i+"次连接","InputStream之后"); BufferedReader br=new BufferedReader(new InputStreamReader(ins)); String data=null; Log.i("第"+i+"次连接","br之后"); i++; while((data=br.readLine())!=null) { String[] datas=data.split(","); Log.i("第"+i+"次连接","datas之后"); int dianping=Integer.parseInt(datas[0]); int zhiliang=Integer.parseInt(datas[1]); float jueduijiaodu=Float.parseFloat(datas[2]); float xiangduijiaodu=Float.parseFloat(datas[3]); // hcs.refresh(dianping,zhiliang); vcs.refresh(dianping,zhiliang ); disks.refresh(xiangduijiaodu, jueduijiaodu, dianping, zhiliang); cuslinear.refresh(jueduijiaodu, xiangduijiaodu, dianping, zhiliang); } }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.i("第"+i+"次连接","可能没连接上"); reconnect(); } catch(Exception e) { e.printStackTrace(); } } public void run() { reconnect(); } } 在客户端的一个Activity中,启动以上线程用来接收数据,当IP地址不对时,当然也就连通不了,于是抛出异常,再重新reconnect( ) (应该没有什么问题吧?),但是在真机上反复出现几次 ![CSDN移动问答][1] [1]: http://www.eoeandroid.com/data/attachment/forum/201403/28/141758f958x35x1733zhqp.jpg 后(大约7、8秒钟的时间,而且不会其他那几条的输出,这个我懂,因为socket没建成,于是try语句块中Socket s=new Socket("192.168.0.103",40011)后的语句就不会再执行了),该Activity就会崩溃,返回到上一个Activity,而且貌似说有内存溢出问题 ![CSDN移动问答][1] [1]: http://www.eoeandroid.com/data/attachment/forum/201403/28/141914bmqym1ezqlqwugt1.jpg 而在模拟器上却不会出现这个问题。如果IP地址正确,连通了,能够正常接收数据了,也不会出现这个问题。这到底是怎么回事呢?

求教:Android socket通信,发送多条,下面是代码

个人写了一个Android Socket的简单通信代码,就是客户端往服务端发送两条数据,但是服务端在接收第二条数据的时候提示socket已关闭连接 客户端代码: Socket socket = new Socket("192.168.56.1", 8888); DataOutputStream dos=new DataOutputStream(socket.getOutputStream()); dos.writeUTF("我是客户端的数据"); DataInputStream din = new DataInputStream(socket.getInputStream()); String msg = din.readUTF(); DataOutputStream dos2=new DataOutputStream(socket.getOutputStream()); dos2.writeUTF("我是客户端的数据22222"); Toast.makeText(SocketActivity.this, msg, Toast.LENGTH_LONG).show(); 服务端代码: while (true) { socket = ss.accept(); System.out.println("Cilent Connected..."); while(true){ DataInputStream din=new DataInputStream(socket.getInputStream()); String string=din.readUTF(); System.out.println(string); din.close(); DataOutputStream dout = new DataOutputStream(socket.getOutputStream()); String str = "服务端发送的数据"; dout.writeUTF(str); dout.close(); } //socket.close(); }

C语言 SOCKET编程 聊天室能检测到局域网的客户端是什么原理

只要客户端发送连接请求,就算局域网内存在有客户端了吗 课程设计的一个要求,可以不用太严谨,能实现就好,我搞不懂这里的原理

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

c# socket如何实现上一条指令发送并收到返回成功后再发送下一条指令呢?

现在在做一个通过socket给下位机发送硬件控制指令的项目,以前使用串口,流程好控制,都是同步的:发送-->等待N毫秒-->接收数据-->处理数据,现在要改成网口,可是socket的发送和接收不在一个方法中,导致我没法实现上一条指令接收完成后(result=true)才允许发送下一条指令,哪位大牛给点思路呢?Thanks

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

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

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

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

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

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

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

和黑客斗争的 6 天!

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

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

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

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

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

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

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

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

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

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

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

立即提问
相关内容推荐