【发布时间】:2017-04-02 20:58:52
【问题描述】:
所以我主要坚持使用带有套接字的 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;
}
我在服务器控制台和客户端控制台recv()s/Prints 中输入“Hello” 由于我不能从控制台进行 C&P,所以我只能用它的图片代替 Console Output
更新问题,正如许多人发布的空终止符我所做的修复它是开关
printf("Command: ");
fgets(smesg, 155, stdin);
在 server.c 中
bzero(smesg, sizeof(smesg));
printf("Command: ");
fgets(smesg, 155, stdin);
strcat(smesg, "\0");
【问题讨论】:
-
货物崇拜 'bzero(message, 2000);'在错误的地方。
-
那么,为什么
memset(0, message, 4040);被注释掉了,为什么你硬编码4040的大小(这是错误的)而不是使用sizeof( message ),以及第二次键入时会发生什么“你好”? -
如果我再次输入 hello 它只会打印相同的内容 Hello 然后一堆这些字符
-
'send(newsock, smesg, strlen(smesg), 0);'甚至不发送 NUL 终止符,并且如上所述,即使发送(例如使用 1+strlen),也不能保证它会在第一次 recv 调用中被接收。