P
Pedro Pinto
Hello there.
I've created a socket program so exchange some messages with a server.
The problem is the following:
it compiles well but when running it gives a segmentation error here:
if(strcmp(argv[1],"-s") == 0) {
I don't know why but if i write
if(!strcmp(argv[1],"-s") == 0) {
no error occurs.....
can someone explain to me what is the error?
I've done a printf before the if and the result is 0, or true if you
prefer.
i start the client with
client -s localhost 17500
Thanks in advance for any help!
Regards
Pedro Pinto
Here is the code:
-------------------------------------------CLIENTE.C
#include "cliente.h"
/* Função Main*/
int main (int argc, char *argv[]) {
/* função que apresenta sintaxe do programa*/
void syntax() {
printf("Sintaxe do programa cliente:\n");
printf(" cliente -s <endereço_servidor>
<porto_servidor>\n");
printf(" -endereço_servidor: (opcional) IP do
servidor\n");
printf(" -porto_servidor: porto do servidor\n");
}
int sock;
int broadcast = 1;
struct sockaddr_in server;
struct sockaddr_in cli;
int endereco_servidor;
int porto_servidor;
/* criacao da socket */
if ((sock = socket(AF_INET,SOCK_DGRAM,0)) <0) {
perror("socket");
exit(1);
}
else {
printf("\nCliente: socket criada \n");
}
if(strcmp(argv[1],"-s") == 0) {
printf("\nentrei n o verifica ip, estamos a funcionar com endereco ip
inserido");
endereco_servidor = inet_aton(atoi(argv[2]), &server.sin_addr);
porto_servidor = atoi(argv[3]);
}
else {//enviar em broadcast
printf("Não foi fornecido o endereço IP, a enviar em broadcast");
porto_servidor = atoi(argv[1]);
server.sin_addr.s_addr = htonl(INADDR_BROADCAST);
/* activar broadcast na socket */
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&broadcast,
sizeof (int)) <0) {
perror("setsockopt");
exit(1);
}
}
void checkPort(porto_servidor) {
if(porto_servidor < 17500 || porto_servidor > 17599) {
printf("Cliente: O porto tem de ser entre 17500 e 17599!\n");
exit(-1);
}
}
/* limpa a estrutura */
bzero((char *)&server, sizeof(server));
/* definir a família de protocolo e porto */
server.sin_family = AF_INET;
server.sin_port = htons(porto_servidor);
/* limpa a estrutura */
bzero((char *)&cli, sizeof(cli));
/* inicio da comunicação com o servidor*/
printf("\nEstou antes da criacao de msg");
int msg[] = {0,1,2,3,4};
printf("\nsizeof msg = $d", sizeof(msg));
int buffer[BUFFSIZE];
/* limpar o buffer */
memset(buffer, 0, BUFFSIZE);
/* enviar a mensagem para o servidor*/
if(sendto(sock, msg, 5, 0, (struct sockaddr *)&server,
sizeof(server)) <0) {
perror("sendto");
exit(1);
}
else {
printf("Cliente: Mensagem enviada com sucesso");
//printMessage(buffer);
}
/* timeout de 10 segundos */
struct timeval timeout;
fd_set readfds;
int sel;
char buf1[64];
/* limpar a fd_set */
FD_ZERO(&readfds);
/* colocar o file descriptor no fd_set */
FD_SET(sock, &readfds);
while(1){
timeout.tv_sec = 10; //segundos
timeout.tv_usec = 0; //microsegundos
sel = select(sock+1, &readfds, NULL, NULL, &timeout);
if (sel == -1) {
perror("select");
}
else if (sel == 0) {
printf("Ocorreu um timeout! Não foi recebida nenhuma mensagem em
10s.\n");
}
else { // foi retornado um file descriptor
if (FD_ISSET(sock, &readfds)) {
recv(sock, buf1, sizeof(buf1), 0);
}
}
}
/* ler a resposta do servidor */
if(recvfrom(sock, buffer, BUFFSIZE, 0, NULL, NULL) < 0) {
perror("rcvfrom");
exit(1);
}
else {
printf("Cliente: Mensagem recebida com sucesso");
//printMessage(buffer);
}
/* fecho da socket */
close(sock);
}
----------------------------------------------------
CLIENTE.H --------------------------
#ifndef CLIENTE
#define CLIENTE
#define BUFFSIZE 6804
/* Bibliotecas necessarias */
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
/* Ficheiros necessarios */
//#include "cli_aux.c"
//#include "cli_imp.c"
/* Definicao das funcoes */
/*******************************************
* Apresenta a sintaxe do programa cliente *
*******************************************/
void syntax();
/**************************************************************************
* Verifica se o numero de parametros do programa cliente estao
correctos *
* argc: numero de argumentos
*
**************************************************************************/
void checkParameters(int argc);
/*********************************************************
* Verifica se a porta esta entre os valores pretendidos *
* port: porta do servidor *
*********************************************************/
void checkPort(int port);
/********
* MAIN *
********/
int main(int argc, char* argv[]);
#endif
I've created a socket program so exchange some messages with a server.
The problem is the following:
it compiles well but when running it gives a segmentation error here:
if(strcmp(argv[1],"-s") == 0) {
I don't know why but if i write
if(!strcmp(argv[1],"-s") == 0) {
no error occurs.....
can someone explain to me what is the error?
I've done a printf before the if and the result is 0, or true if you
prefer.
i start the client with
client -s localhost 17500
Thanks in advance for any help!
Regards
Pedro Pinto
Here is the code:
-------------------------------------------CLIENTE.C
#include "cliente.h"
/* Função Main*/
int main (int argc, char *argv[]) {
/* função que apresenta sintaxe do programa*/
void syntax() {
printf("Sintaxe do programa cliente:\n");
printf(" cliente -s <endereço_servidor>
<porto_servidor>\n");
printf(" -endereço_servidor: (opcional) IP do
servidor\n");
printf(" -porto_servidor: porto do servidor\n");
}
int sock;
int broadcast = 1;
struct sockaddr_in server;
struct sockaddr_in cli;
int endereco_servidor;
int porto_servidor;
/* criacao da socket */
if ((sock = socket(AF_INET,SOCK_DGRAM,0)) <0) {
perror("socket");
exit(1);
}
else {
printf("\nCliente: socket criada \n");
}
if(strcmp(argv[1],"-s") == 0) {
printf("\nentrei n o verifica ip, estamos a funcionar com endereco ip
inserido");
endereco_servidor = inet_aton(atoi(argv[2]), &server.sin_addr);
porto_servidor = atoi(argv[3]);
}
else {//enviar em broadcast
printf("Não foi fornecido o endereço IP, a enviar em broadcast");
porto_servidor = atoi(argv[1]);
server.sin_addr.s_addr = htonl(INADDR_BROADCAST);
/* activar broadcast na socket */
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&broadcast,
sizeof (int)) <0) {
perror("setsockopt");
exit(1);
}
}
void checkPort(porto_servidor) {
if(porto_servidor < 17500 || porto_servidor > 17599) {
printf("Cliente: O porto tem de ser entre 17500 e 17599!\n");
exit(-1);
}
}
/* limpa a estrutura */
bzero((char *)&server, sizeof(server));
/* definir a família de protocolo e porto */
server.sin_family = AF_INET;
server.sin_port = htons(porto_servidor);
/* limpa a estrutura */
bzero((char *)&cli, sizeof(cli));
/* inicio da comunicação com o servidor*/
printf("\nEstou antes da criacao de msg");
int msg[] = {0,1,2,3,4};
printf("\nsizeof msg = $d", sizeof(msg));
int buffer[BUFFSIZE];
/* limpar o buffer */
memset(buffer, 0, BUFFSIZE);
/* enviar a mensagem para o servidor*/
if(sendto(sock, msg, 5, 0, (struct sockaddr *)&server,
sizeof(server)) <0) {
perror("sendto");
exit(1);
}
else {
printf("Cliente: Mensagem enviada com sucesso");
//printMessage(buffer);
}
/* timeout de 10 segundos */
struct timeval timeout;
fd_set readfds;
int sel;
char buf1[64];
/* limpar a fd_set */
FD_ZERO(&readfds);
/* colocar o file descriptor no fd_set */
FD_SET(sock, &readfds);
while(1){
timeout.tv_sec = 10; //segundos
timeout.tv_usec = 0; //microsegundos
sel = select(sock+1, &readfds, NULL, NULL, &timeout);
if (sel == -1) {
perror("select");
}
else if (sel == 0) {
printf("Ocorreu um timeout! Não foi recebida nenhuma mensagem em
10s.\n");
}
else { // foi retornado um file descriptor
if (FD_ISSET(sock, &readfds)) {
recv(sock, buf1, sizeof(buf1), 0);
}
}
}
/* ler a resposta do servidor */
if(recvfrom(sock, buffer, BUFFSIZE, 0, NULL, NULL) < 0) {
perror("rcvfrom");
exit(1);
}
else {
printf("Cliente: Mensagem recebida com sucesso");
//printMessage(buffer);
}
/* fecho da socket */
close(sock);
}
----------------------------------------------------
CLIENTE.H --------------------------
#ifndef CLIENTE
#define CLIENTE
#define BUFFSIZE 6804
/* Bibliotecas necessarias */
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
/* Ficheiros necessarios */
//#include "cli_aux.c"
//#include "cli_imp.c"
/* Definicao das funcoes */
/*******************************************
* Apresenta a sintaxe do programa cliente *
*******************************************/
void syntax();
/**************************************************************************
* Verifica se o numero de parametros do programa cliente estao
correctos *
* argc: numero de argumentos
*
**************************************************************************/
void checkParameters(int argc);
/*********************************************************
* Verifica se a porta esta entre os valores pretendidos *
* port: porta do servidor *
*********************************************************/
void checkPort(int port);
/********
* MAIN *
********/
int main(int argc, char* argv[]);
#endif