2013-12-08 2 views
0

В C, я пытаюсь подключиться к серверу с помощью следующей функции:Почему мой вызов connect() не удается?

int clientConnect() { 

//1. Set up connection address and port 
char *ipAddress = SMSA_DEFAULT_IP; 
int port = SMSA_DEFAULT_PORT; 

//1a. Set up a sockaddr_in struct as described in lecture 
struct sockaddr_in caddr; 
caddr.sin_family = AF_INET; 
caddr.sin_addr.s_addr = htonl(SMSA_DEFAULT_IP); 
caddr.sin_port = htons(port); 

//2. Create a socket 
server_socket = socket(PF_INET, SOCK_STREAM, 0); 

if(server_socket == -1) 
{ 
    logMessage(1, "There was an error creating a socket in clientConnect()"); 
    return -1; 
} 

//3. Connect 
if(connect(server_socket, (const struct sockaddr *)&caddr, sizeof(struct sockaddr)) == -1) 
{ 
    logMessage(1, "There was an error connecting in clientConnect()");\ 
    return -1; 
} 

logMessage(2, "The connection was made!"); 
return 0;} 

Когда эта функция вызывается, я получаю сообщение в моем журнале There was an error connecting in clientConnect(). Это мой первый раз, когда я делаю сетевое программирование с помощью C, поэтому я подозреваю, что у меня что-то не хватает.

+5

Проверить значение 'errno' (или используйте' PError() '), если системный вызов (например,' подключения() ') терпит неудачу. - Могло быть много причин: неправильный IP-адрес, сервер не отвечает, ... –

+3

Здесь мораль. Когда вы получите сообщение об ошибке, запишите ошибку *, а не только текст вашего собственного проекта. Ваш собственный текст не может вам ничего сказать, кроме того, что что-то пошло не так. Действительная ошибка может. – EJP

+0

@Martin R Спасибо за подсказку errno, очень полезно – Mike

ответ

0

Последний аргумент connect должен быть sizeof caddr:

connect(server_socket, (const struct sockaddr *)&caddr, sizeof caddr); 
+0

Это, конечно, правильный код. Но я думаю, что 'struct sockaddr' и' struct sockaddr_in' имеют одинаковый размер (по крайней мере, на OS X), поэтому это не объяснит ошибку. - Возможно, я ошибаюсь. –

+0

@MartinR Если это исправляет проблему, они должны быть разными, QED. – EJP

+0

@MartinR Нет необходимости в том, чтобы 'sockaddr' и' sockaddr_in' имели одинаковый размер, поэтому адреса сокетов всегда передаются как пара 'sockaddr *' и 'socklen_t'. –

Смежные вопросы