Tag: 发送

Raw Socket Linux发送/接收数据包

在接收数据包时遇到一些问题。 我可以接收和读取传入的数据包,但我想我不会与任何主机握手。 我只想在收到答案的情况下将数据包发送到具有开放端口的远程计算机,以查看TTL(生存时间)和窗口大小。 有谁知道错误在哪里? (我对C编程知之甚少) 码: #include #include #include #include #include #include #include #include #include #include #include struct pseudohdr { u_int32_t src_addr; u_int32_t dst_addr; u_int8_t padding; u_int8_t proto; u_int16_t length; }; struct data_4_checksum { struct pseudohdr pshd; struct tcphdr tcphdr; char payload[1024]; }; unsigned short comp_chksum(unsigned short *addr, int len) { long sum = 0; […]

sendmsg如何工作?

如您所知sendmsg有此声明: int sendmsg(int s, const struct msghdr *msg, int flags); 和msghdr结构有这种forms: struct msghdr { void * msg_name; /* optional address */ socklen_t msg_namelen; /* size of address */ struct iovec * msg_iov; /* scatter/gather array */ size_t msg_iovlen; /* # elements in msg_iov */ void * msg_control; /* ancillary data, see below */ socklen_t msg_controllen; […]

使用C套接字在HTTP响应中发送二进制文件

我试图在http响应中发送二进制文件(png图像)。 FILE *file; char *buffer; int fileLen; //Open file file = fopen(“1.png”, “rb”); if (!file) { return; } //Get file length fseek(file, 0, SEEK_END); fileLen=ftell(file); fseek(file, 0, SEEK_SET); //Allocate memory buffer=(char *)malloc(fileLen+1); if (!buffer) { fprintf(stderr, “Memory error!”); fclose(file); return; } //Read file contents into buffer fread(buffer, fileLen, 1, file); fclose(file); //free(buffer); char header[102400]; sprintf(header, […]

对send()的多次调用合并为一次调用recv()

我有一个客户端 – 服务器应用程序。 客户端使用两个不同的send()调用发送一个字符串,后跟一个整数。 这两个数据应该存储在服务器上的两个不同变量中。 问题是发送的两个变量都是在recv()调用时收到的。 因此,由两个不同的send() s send()的两个字符串被链接并存储在第一个recv()的缓冲区中。 server.c: printf(“Incoming connection from client %s:%i accepted\n”,inet_ntoa(clientSocketAddress.sin_addr),ntohs(clientSocketAddress.sin_port)); memset(buffer,0,sizeof(buffer)); int sizeofMessage; if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0)==sizeofMessage)<0) { printf("recv failed."); closesocket(serverSocket); clearWinsock(); return EXIT_FAILURE; } char* Name=buffer; printf("Name: %s\n",Name); if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0))<0) { printf("bind failed."); closesocket(serverSocket); clearWinsock(); return EXIT_FAILURE; } int integer=ntohs(atoi(buffer)); printf("integer: %i\n",intero); client.c: if (send(clientSocket,Name,strlen(Name),0)!=strlen(Name)) { printf(“send failed”); closesocket(clientSocket); clearWinsock(); […]

使用C TCP套接字,可以’发送’返回零吗?

使用TCP套接字时,C sendfunction是否有可能返回零? 手册页只是说它将返回发送的字节数,但我不确定它是否只会在无法发送任何数据时返回-1。

为什么假设send可能返回的数据少于阻塞套接字上传输的请求数据?

在流套接字上发送数据的标准方法一直是调用send和一大块数据进行写入,检查返回值以查看是否所有数据都已发送,然后再次调用send直到整个消息被接受为止。 例如,这是一个常见方案的简单示例: int send_all(int sock,unsigned char * buffer,int len){ 不存在 while(len> 0){ nsent = send(sock,buffer,len,0); if(nsent == -1)//错误 返回-1; buffer + = nsent; len – = nsent; } 返回0; //好的,发送了所有数据 } 甚至BSD手册也提到了这一点 …如果套接字上没有可用的消息空间来保存要传输的消息,则send() 通常会阻塞 … 这表明我们应该假设send可以在不发送所有数据的情况下返回。 现在我发现这个相当破碎,但即使是W. Richard Stevens在他的标准参考书中假定这是关于网络编程的 ,而不是在开头的章节中,但更高级的例子使用他自己的写(写所有数据)函数而不是调用write。 现在我认为这仍然或多或少地被破坏,因为如果send无法传输所有数据或接受底层缓冲区中的数据并且套接字阻塞,则send应该阻塞并在整个发送请求被接受时返回。 我的意思是,在上面的代码示例中,如果发送返回的数据发送的数量较少,将会发生的情况是,将使用新请求再次调用它。 自上次通话以来有什么变化? 最多几百个CPU周期已经过去,因此缓冲区仍然是满的。 如果发送现在接受数据,为什么它不能接受它? 否则,我们将以低效循环结束upp,我们试图在无法接受数据并继续尝试的套接字上发送数据,否则? 因此,如果需要,似乎解决方法会导致代码效率极低,在这种情况下,应该避免阻塞套接字,而应该使用非阻塞套接字和select。