- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我主要坚持使用带有套接字的 MAC/Linux 并且一切正常,所以我尝试在某种程度上关闭我的 Windows 套接字,也许我这样做是错误的,这就是整个问题,但问题我现在正在尝试修复的是控制台在服务器发送的实际字符串之后打印随机字符。服务器.c
#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#include "stdafx.h"
#include <conio.h>
#include <io.h>
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
#pragma comment(lib,"ws2_32.lib") //Winsock Library
char message[4040];
int main()
{
WSADATA wsa;
SOCKET sock, newsock;
int c;
struct sockaddr_in server, client;
char smesg[155];
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
return 1;
}
printf("Initialised.\n");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
printf("Could not create socket! Error: %d", WSAGetLastError());
return 1;
}
//textcolor(2);
printf("Socket Created!\n");
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(3939);
//bind
if (bind(sock, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed! Error Code: %d", WSAGetLastError());
}
puts("Binded!");
printf("\nNow Listening...\n");
listen(sock, 1);
//Accept!
c = sizeof(struct sockaddr_in);
newsock = accept(sock, (struct sockaddr *)&client, &c);
if (newsock == INVALID_SOCKET) {
printf("Couldn't Accept connection!");
}
printf("Accepted Connection!\n");
//char *client_ip = inet_ntoa(client.sin_addr);
//int client_port = ntohs(client.sin_port);
while (1) {
printf("Command: ");
fgets(smesg, 4040, stdin);
send(newsock, smesg, strlen(smesg), 0);
bzero(smesg, sizeof(smesg));
//memset(0, smesg, 4040);
}
return 0;
}
客户端.c
#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#include "stdafx.h"
#include <conio.h>
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
#pragma comment(lib,"ws2_32.lib") //Winsock Library
int main(int argc, char *argv[])
{
int reader;
WSADATA wsa;
SOCKET sock;
struct sockaddr_in server;
char message[2000];
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
return 1;
}
printf("Initialised.\n");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
printf("Could not create socket! Error: %d", WSAGetLastError());
return 1;
}
//textcolor(2);
printf("Socket Created!\n");
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(3939);
//Connect
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
puts("Connect Error");
return 1;
}
puts("Connected\n");
while (1) {
//memset(0, message, 4040);
reader = recv(sock, message, 2000, 0);
fprintf(stdout, "%s", message);
bzero(message, 2000);
}
return 0;
}
我在服务器控制台和客户端控制台中键入“Hello”recv()s/Prints由于我无法从控制台进行 C&P,所以只能用它的图片代替 Console Output
更新许多人发布的空终止符问题,我修复它的方法是 switch
printf("Command: ");
fgets(smesg, 155, stdin);
在server.c中
bzero(smesg, sizeof(smesg));
printf("Command: ");
fgets(smesg, 155, stdin);
strcat(smesg, "\0");
最佳答案
真的很难说清楚您为什么会遇到这种不稳定的行为,因为您同时误用了几样东西,因此可能会发生非常奇怪的事情。
首先,套接字是流,它们不是消息传递机制。这意味着套接字没有您尝试发送和接收的“消息”的概念。接收端的套接字根本不知道你在发送端写了 10 个字节。所以,如果你想使用套接字发送消息,那么你必须在流之上实现一个消息传递协议(protocol)。
在流协议(protocol)之上的消息传递协议(protocol)的最简单版本是在每条消息前加上消息的长度。所以:在发送端,首先将消息的长度写入套接字,然后写入消息本身。在阅读结束时,首先阅读长度,然后阅读消息。长度是固定的字节数(通常为 4 个字节),因此您始终知道要读/写的确切字节数。
然后,由于套接字是流,所以你必须注意每次从套接字中到底读取了多少字节。仅仅因为您请求 10 个字节并不意味着您将收到 10 个字节。如果您请求 10 个字节,而您收到的少于 10 个字节,那么您必须重复调用以读取更多字节。 recv()
函数不返回任何“读者”。它返回成功读取的字节数。并且它不会存储在以后永远不会检查的变量中。将其考虑在内,以便您知道是否收到了您期望的完整消息。
另外,不要忘记 asciiz 空字符终止符。发送字符串时,可以将消息的长度视为字符串的 strlen()
。但是当您收到该字符串时,它不会以 null-char 终止,因此您不能继续将其提供给 printf()
而不先向其附加 \0
。如果您省略空字符终止符,则 printf()
将打印您的字符串,然后打印您的接收缓冲区中已经存在的任何垃圾。
关于C Socket recv()ing 奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173475/
我有这种来自 Google map 自动完成的奇怪行为(或者我可能错过了某事)...想法?奇怪的: 您在输入中输入某物,例如“伦敦” 您按 [ENTER] 你按下 [CLEAR] 按钮 你点击进入'输
这段代码与《Learning Java》(Oracle Press Books)一书中的代码完全一样,但它不起作用。我不明白为什么它不起作用,它应该起作用。我用 OpenJDK 和 Sun JDK 7
示例 1 中究竟发生了什么?这是如何解析的? # doesnt split on , [String]::Join(",",("aaaaa,aaaaa,aaaaa,aaaaa,aaaaa,aa
我需要获得方程式系统的解决方案。为此,我使用函数sgesv_()。 一切都很好,它使我感到解决方案的正确结果。 但是我得到一个奇怪的警告。 警告:从不兼容的指针类型传递'sgesv_'的参数3 我正在
我目前在制作动画时遇到一个奇怪的问题: [UIView animateWithDuration:3 delay:0
alert('works'); $(window).load(function () { alert('does not work'); });
我的代码: public class MyTest { public class StringSorter implements Comparator { public
我正在学习 JavaScript。尝试理解代码, function foo (){ var a = b = {name: 'Hai'}; document.write(a.name +''
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这按预期工作: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ 这样做: [dgorur@ted ~]$ env -i which date which: no
struct BLA { int size_; int size()const{ return size_; } } int x; BLA b[ 2 ]; BLA * p = &b[
我有以下代码: #test img {vertical-align: middle;} div#test { border: 1px solid green; height: 150px; li
我想大多数使用过 C/C++ 的人都对预处理器的工作原理有一定的直觉(或多或少)。直到今天我也是这么认为的,但事实证明我的直觉是错误的。故事是这样的: 今天我尝试了一些东西,但我无法解释结果。首先考虑
我想为 TnSettings 做 mock,是的,如果通过以下方法编写代码,它就可以工作,问题是我们需要为每个案例编写 mock 代码,如果我们只 mock 一次然后执行多个案例,那么第二个将报告异常
我的项目中有以下两个结构 typedef volatile struct { unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over U
Regex rx = new Regex(@"[+-]"); string[] substrings = rx.Split(expression); expression = "-9a3dcb
我的两个应用程序遇到了一个奇怪的问题。这是设置: 两个 tomcat/java 应用程序,在同一个网络中运行,连接到相同的 MS-SQL-Server。一个应用程序,恰好按顺序位于 DMZ 中可从互联
我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 作斗争。 拿这段代码: this.webView.setOnLongClickListener(new
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我是一名优秀的程序员,十分优秀!