sockaddr_in вызывает segfault? - PullRequest
       1

sockaddr_in вызывает segfault?

0 голосов
/ 11 января 2011

Сейчас я работаю над созданием системы сервер / клиент в C, и у меня возникли небольшие проблемы с клиентской частью. Из того, что я видел, мне нужно использовать sockaddr_in, чтобы я мог подключиться к серверу. Тем не менее, я получаю сегфо каждый раз. Я считаю, что sockaddr_in как-то связан с этим, так как комментирование и последующие ссылки в программе исправляют ошибку.

код:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>

int main(int argc, char** argv)
{
int Csock;
int con;
char *data = 0;
char buf[101] = "";
struct sockaddr_in addr;

Csock = socket(AF_INET, SOCK_STREAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(3435);

con = connect(Csock, (struct sockaddr*) &addr, sizeof(addr));

write(con, "Text", sizeof("Text"));
*data = read(con, buf, 100);
puts(data);
return 0;
}

к сожалению, я довольно новичок в C, так что это столько, сколько я могу себе представить ... может кто-нибудь сказать мне способ устранения segfault?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 11 января 2011

Быстрый комментарий:

data - указатель на символ, который не указывает на выделенную память, поэтому:

*data = read(con, buf, 100);

недопустимо!Вы не можете разыменовать нулевой указатель.

Кроме того, read возвращает ssize_t, а не символ, поэтому, возможно:

ssize_t nread = read(con, buf, 100);

, а затем распечатывает нуд с помощью printf.

2 голосов
/ 11 января 2011

Одной сразу очевидной вещью, которая неправильна, является sizeof &addr, когда вы имеете в виду sizeof addr.Также вы никогда не устанавливаете адрес, к которому хотите подключиться, только порт.В большинстве систем ни одна из этих ошибок не приведет к сбою, но они не позволят программе работать.

Также рекомендуется никогда не устанавливать напрямую структуры sockaddr, а вместо этого использовать getaddrinfo.

0 голосов
/ 11 января 2011

Проблема, я думаю, связана с вашим заявлением о подключении. Вам нужно

con = connect(Csock, (struct sockaddr*) &addr, sizeof(addr));

sizeof () возвращает размер объекта. Я не знаю, каков размер структуры addr, но оператор sizeof (& addr) вернет 4 (при условии 32-битной системы), и я вполне уверен, что размер структуры addr> 4 байта.

& является справочным оператором (или адресом) и дает вам адрес конкретной структуры. Адрес (в 32-битных системах) составляет 4 байта. Обычно для типов функций (например, для функции соединения) требуется фактический размер структуры. Это часто делается в целях обратной совместимости, так что если размер структуры изменится в какой-либо будущей версии SDK или библиотеки, старый код не нужно будет менять для работы с новыми библиотеками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...