Ошибка программы сокета C

Это мой код клиента C. Как-то он не работает. Он работал, когда я пытался с аргументом передачи. Я хочу, чтобы программа попросила пользователя portname hostname затем попросит имя portname и затем отправить сообщение:

Введите имя хоста: localhost Введите имя порта: 56456 Введите сообщение: Привет, пользователь Введите сообщение: Что Введите сообщение: Как вы

И как только хозяин и порт, заданные ему, не должны просить снова (до перезапуска программы). Я попытался do while цикл while, но он не работает. На сервере будет отображаться отправленное сообщение

Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys types.h="">
#include <sys socket.h="">
#include <netinet in.h="">
#include <netdb.h> 

void error(const char *msg)
{
 perror(msg);
 exit(0);
}

//int main(int argc, char *argv[])
int main()
{
 char *argv[256];
 int argc;
 int sockfd, portno, n;
 struct sockaddr_in serv_addr;
 struct hostent *server;
 printf("\n\nEnter Hostname\n\n");
 fgets(argv[0],256,stdin);
 char buffer[256];
 if (argc < 3) {
 fprintf(stderr,"usage %s hostname port\n", argv[0]);
 exit(0);
 }
 portno = atoi(argv[2]);
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd < 0) 
 error("ERROR opening socket");
 server = gethostbyname(argv[1]);
 if (server == NULL) {
 fprintf(stderr,"ERROR, no such host\n");
 exit(0);
 }
 bzero((char *) &serv_addr, sizeof(serv_addr));
 serv_addr.sin_family = AF_INET;
 bcopy((char *)server->h_addr, 
 (char *)&serv_addr.sin_addr.s_addr,
 server->h_length);
 serv_addr.sin_port = htons(portno);
 if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
 error("ERROR connecting");


 printf("Please enter the message: ");
 bzero(buffer,256);
 //buffer = tempFunc();
 fgets(buffer,255,stdin);
 printf("\n\nHere Goes the output\n%s",buffer);
 n = write(sockfd,buffer,strlen(buffer));
 if (n < 0) 
 error("ERROR writing to socket");
 bzero(buffer,256);
 n = read(sockfd,buffer,255);
 if (n < 0) 
 error("ERROR reading from socket");
 printf("%s\n",buffer);
 close(sockfd);
 return 0;

}
</netdb.h></netinet></sys></sys></string.h></unistd.h></stdlib.h></stdio.h>
4 ответа

Во-первых, не используйте char * argv[256]

char buffer[256];
printf("\n\nEnter Hostname\n\n");
fgets(buffer,256,stdin);

Затем установите флажок " Извлечение конечного символа новой строки из ввода fgets() для работы с fgets.

Для бесконечного цикла не делайте

int a=2; // Useless declaration
do
{
 // Your code
}while(a=2) // I guess you wanted (a == 2)

использовать:

while(1)
{
 // Your code
}

Или

for(;;)
{
 // Your code
}

Кажется, что вам нужно немного тренироваться, попробовать некоторые учебные пособия, найти хорошие практики на C, включить предупреждающие флаги в компиляции и научиться использовать отладчик наподобие gdb.

PS:


Сначала исправьте некоторые основные вещи. Ваш argv был массивом указателей, указывая на какое-то произвольное место в памяти, здесь ваша программа могла сбой. Далее, когда вы читаете ввод с помощью fgets, вы также читаете \n. Поэтому localhost\n не является допустимым именем хоста. Замените последний символ двоичным нулем, чтобы удалить \n.

int main()
{

 char hostname[256];
 char port[16];
 char buffer[256];
 int sockfd, portno, n;
 struct sockaddr_in serv_addr;
 struct hostent *server;
 printf("\n\nEnter Hostname\n\n");
 fgets(hostname, 256,stdin);

 hostname[ strlen(hostname) - 1 ] = '\0';
 fgets(port, 16, stdin);
 port[ strlen(port) - 1] = '\0';

 portno = atoi(port);
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd < 0) 
 error("ERROR opening socket");
 server = gethostbyname(hostname);
 if (server == NULL) {
 fprintf(stderr,"ERROR, no such host\n");
 exit(0);
 //...
}


Для аргумента командной строки вы не должны снова объявлять argc и argv ! Попробуйте this-

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys types.h="">
#include <sys socket.h="">
#include <netinet in.h="">
#include <netdb.h>

void error(const char *msg)
{
 perror(msg);
 exit(0);
}

int main(int argc, char *argv[])
{
 int sockfd, portno, n;
 struct sockaddr_in serv_addr;
 struct hostent *server;
 char buffer[256];
 if (argc < 3) {
 fprintf(stderr,"usage %s hostname port\n", argv[0]);
 exit(0);
 }
 portno = atoi(argv[2]);
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd < 0)
 error("ERROR opening socket");
 server = gethostbyname(argv[1]);
 if (server == NULL) {
 fprintf(stderr,"ERROR, no such host\n");
 exit(0);
 }
 bzero((char *) &serv_addr, sizeof(serv_addr));
 serv_addr.sin_family = AF_INET;
 bcopy((char *)server->h_addr,
 (char *)&serv_addr.sin_addr.s_addr,
 server->h_length);
 serv_addr.sin_port = htons(portno);
 if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
 error("ERROR connecting");


 printf("Please enter the message: ");
 bzero(buffer,256);
 //buffer = tempFunc();
 fgets(buffer,255,stdin);
 printf("\n\nHere Goes the output\n%s",buffer);
 n = write(sockfd,buffer,strlen(buffer));
 if (n < 0)
 error("ERROR writing to socket");
 bzero(buffer,256);
 n = read(sockfd,buffer,255);
 if (n < 0)
 error("ERROR reading from socket");
 printf("%s\n",buffer);
 close(sockfd);
 return 0;

}
</netdb.h></netinet></sys></sys></string.h></unistd.h></stdlib.h></stdio.h>

и добавьте цикл while, где вы хотите!


Вот код, который работает с циклом. Благодаря @Coconop

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys types.h="">
#include <sys socket.h="">
#include <netinet in.h="">
#include <netdb.h> 

void error(const char *msg)
{
 perror(msg);
 exit(0);
}

int main()
{

 char hostname[256];
 char port[16];
 char buffer[256];
 int sockfd, portno, n;
 struct sockaddr_in serv_addr;
 struct hostent *server;
 printf("\n\nEnter Hostname\n\n");
 fgets(hostname, 256,stdin);

 hostname[ strlen(hostname) - 1 ] = '\0';
 fgets(port, 16, stdin);
 port[ strlen(port) - 1] = '\0';

 portno = atoi(port);
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd < 0) 
 error("ERROR opening socket");
 server = gethostbyname(hostname);
 if (server == NULL) {
 fprintf(stderr,"ERROR, no such host\n");
 exit(0);
 }

bzero((char *) &serv_addr, sizeof(serv_addr));
 serv_addr.sin_family = AF_INET;
 bcopy((char *)server->h_addr, 
 (char *)&serv_addr.sin_addr.s_addr,
 server->h_length);
 serv_addr.sin_port = htons(portno);
 if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
 error("ERROR connecting");
int a=2;
do {
 printf("Please enter the message: ");
 bzero(buffer,256);
 //buffer = tempFunc();
 fgets(buffer,255,stdin);
 printf("\n\nHere Goes the output\n%s",buffer);
 n = write(sockfd,buffer,strlen(buffer));
}while(a=2);
 if (n < 0) 
 error("ERROR writing to socket");
 bzero(buffer,256);
 n = read(sockfd,buffer,255);
 if (n < 0) 
 error("ERROR reading from socket");
 printf("%s\n",buffer);
 close(sockfd);
 return 0;

}
</netdb.h></netinet></sys></sys></string.h></unistd.h></stdlib.h></stdio.h>

licensed under cc by-sa 3.0 with attribution.