gpt4 book ai didi

C 套接字 : recv and send all data

转载 作者:太空狗 更新时间:2023-10-29 16:52:00 27 4
gpt4 key购买 nike

我想获得与此类似的行为:

  1. 服务器运行
  2. 客户端运行
  3. 客户键入“帮助”或其他命令
  4. 服务器适当响应
  5. 转到3

问题是当我的函数 excCommand("help") 运行时,只接收并打印了一点文本。我的文本文件是这样的:

COMMAND HELP:

help - Display help
quit - Shutdown client

只打印 COMMAND HELP。另一个问题是,当我键入命令时,不会打印任何内容,并且在 2 个命令客户端退出后。这是特别的作品:

while (quit)
{
getLine("client> ", command, 10);
if (strcmp(command, "quit") == 0)
quit = 0;
else
excCommand(command);
}

这是服务器:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "common.h"

int main(int argc, char *argv[])
{
if (argc != 2)
ErrorWithUserMessage("Parameter(s)", "<Server Port>");

char *service = argv[1];

int servSock = SetupTCPServerSocket(service);
if (servSock < 0)
ErrorWithUserMessage("SetupTCPServerSocket() failed: ", "unable to establish");

unsigned int childProcessCount = 0;
while (1)
{
int clntSock = AcceptTCPConnection(servSock);

pid_t processID = fork();
if (processID < 0)
ErrorWithSystemMessage("fork() failed");
else if (processID == 0)
{
close(servSock);
HandleTCPClient(clntSock);
exit(EXIT_SUCCESS);
}

printf("with child process: %d\n", processID);
close(clntSock);
childProcessCount++;

//clean up zombies
while (childProcessCount)
{
processID = waitpid((pid_t) - 1, NULL, WNOHANG);
if (processID < 0)
ErrorWithSystemMessage("waitpid() failed");
else if (processID == 0)
break;
else
childProcessCount--;
}

}

}

处理程序:

void HandleTCPClient(int clntSock)
{
char buffer[BUFSIZE];
ssize_t numBytesRcvd = recv(clntSock, buffer, BUFSIZE, 0);
buffer[numBytesRcvd] = '\0';
if (numBytesRcvd < 0)
ErrorWithSystemMessage("recv() failed");
if (strcmp(buffer, "help") == 0)
{
FILE *fp = fopen("help.txt", "r");
if (fp)
{
char line[128];
while (fgets(line, sizeof(line), fp) != NULL)
{
if (send(clntSock, line, sizeof(line), 0) < 0)
ErrorWithSystemMessage("send() failed");
}
fclose(fp);
}
}

close(clntSock);
}

这是我的客户:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/socket.h>

#include "common.h"

int sock;

void getLine(char *message, char *buf, int maxLen)
{
printf("%s", message);
fgets(buf, maxLen, stdin);
buf[strlen(buf) - 1] = 0;
}

void excCommand(char *command)
{
if ( send(sock, command, strlen(command), 0) < 0)
ErrorWithSystemMessage("send() failed");

char replyMessage[BUFSIZE];
ssize_t numBytesRecv = 0;
do
{
numBytesRecv = recv(sock, replyMessage, BUFSIZE, 0);
if ( numBytesRecv < 0)
ErrorWithSystemMessage("recv() failed");
printf("%s\n", replyMessage);
memset(&replyMessage, 0, sizeof(replyMessage));

}
while (numBytesRecv > 0);
}

void PrintFile(const char *filename)
{
FILE *fp;
fp = fopen(filename, "r");
if (fp)
{
char line[128];
while (fgets(line, sizeof(line), fp) != NULL)
fputs(line, stdout);
fputs("\n", stdout);
fclose(fp);
}
}

int main(int argc, char *argv[])
{
int quit = 1;
char command[10];

if (argc < 2 || argc > 3)
{
ErrorWithUserMessage("Parameter(s)", "<Server Address> <Server Port>");
}

char *server = argv[1];
char *service = argv[2];

sock = SetupTCPClientSocket(server, service);
if (sock < 0)
ErrorWithUserMessage("SetupTCPClientSocket() failed: ", "unable to connect");

printf("Connection established!\n\n");

PrintFile("menu.txt");
excCommand("help");

while (quit)
{
getLine("client> ", command, 10);
if (strcmp(command, "quit") == 0)
quit = 0;
else
excCommand(command);
}

fputs("\n", stdout);
close(sock);
exit(EXIT_SUCCESS);
}

不好意思啰嗦了

最佳答案

recv()send() 函数不保证发送/接收所有数据(参见 man recvman send)

你需要实现你自己的send_all()recv_all(),比如

bool send_all(int socket, void *buffer, size_t length)
{
char *ptr = (char*) buffer;
while (length > 0)
{
int i = send(socket, ptr, length);
if (i < 1) return false;
ptr += i;
length -= i;
}
return true;
}

以下指南可能对您有所帮助Beej's Guide to Network Programming

关于C 套接字 : recv and send all data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com