В простой программе, где я пытаюсь отправить данные командной строки от клиента к серверу, я продолжаю получать «сломанную трубу» для стороны сервера. Я отправляю строку на сервер, и сервер возвращает строку клиенту в нижнем регистре.
Сервер:
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include<string.h>
#include <ctype.h>
#include <unistd.h>
int main()
{
char str[100];
int listen_fd, comm_fd;
struct sockaddr_in servaddr;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
bzero( &servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(37892);
bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
listen(listen_fd, 10);
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
while(1){
bzero( str, 100);
read(comm_fd,str,100);
for(int i = 0; i < strlen(str); i++){
str[i] = tolower(str[i]);
}
printf("Echoing back - %s",str);
write(comm_fd, str, strlen(str)+1);
}
}
Клиент
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include<string.h>
#include<ctype.h>
#include <unistd.h>
int main(int argc,char **argv)
{
int sockfd,n;
char sendline[100];
char recvline[100];
struct sockaddr_in servaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof servaddr);
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(37892);
inet_pton(AF_INET,"127.0.0.1",&(servaddr.sin_addr));
connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(argc==1) printf("\nNo arguments");
if (1){
{
bzero( sendline, 100);
bzero( recvline, 100);
strcpy(sendline, argv[1]);
write(sockfd,sendline,strlen(sendline)+1);
read(sockfd,recvline,100);
printf("%s",recvline);
}
}
}
Проблема, которую я обнаружил, заключалась в том, что, когда сторона клиента завершает отправку строки, ввод командной строки не работает как fgets()
, когда цикл будет ждать ввода другого пользователя. Если я изменю if(1)
на стороне клиента на while(1)
, он, очевидно, запустит бесконечный цикл, поскольку новые входные данные не добавляются. Дилемма заключается в том, как я смогу поддерживать работоспособность сервера, чтобы непрерывно возвращать строку клиенту при обработке отдельных запросов из командной строки на стороне клиента?
read()
иwrite()
, что всегда является серьезной проблемой. Вы также не проверяете ошибкиsocket()
илиconnect()
(илиbind()
илиaccept()
) - то же самое. Вы копируетеargv[1]
вsendline
, что на самом деле не нужно, но если вы копируете, вы должны проверить, достаточно ли места. Хотяread()
в клиенте «безопасен», вам нужно знать, сколько байтов было получено, чтобы вы могли распечатать правильное число; вы могли прочитать 100 из 120 байтов, и строка не будет завершаться нулем. Вы должны быть очень и очень осторожны! - person Jonathan Leffler   schedule 21.02.2018write()
. Затем вы можете закрыть соединение и вернуться к следующему. Вы также не закрываете файловые дескрипторы, поэтому рано или поздно они у вас закончатся. - person Jonathan Leffler   schedule 21.02.2018