исключение при вызове accept () - PullRequest
1 голос
/ 18 ноября 2011
//this is server side code snippet used for chat application 

int* sockPtr;
int result;
result=listen(sClient,10); //sClient is SOCKET that is bind to specific port for  listining incoming connection 
sockPtr = (int*)malloc(sizeof(int));        
*sockPtr= accept(sClient,(SOCKADDR*)&client_info,&addrlen); //here is the problem on sockPtr [which is integer type pointer]

но когда клиент пытается подключиться, возникает исключение, говорящее

Unhandled exception at 0x0041ce6b in server.exe: 0xC0000005:
Access violation reading location 0x0000000.

Что мне делать?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

при вызове accept() вторым параметром является буфер, который вы предоставляете для хранения информации об адресе, который зависит от семейства адресов прослушиваемого сокета.

Итак, буфер, указанный во втором параметре, должен быть объявлен и выделен перед вызовом accept(), а третий параметр должен содержать выделенный размер для буфера. функция затем заполнит буфер и вернет фактическую длину буфера, который был заполнен запрошенной информацией.

что-то вроде:

struct sockaddr_in client_info;
int                client_info_length;
[...]

client_info_length = sizeof(client_info);
*sockPtr= accept(sClient,(SOCKADDR*)&client_info,&client_info_length);

структура struct sockaddr_in хранит адрес для семейства интернет-адресов (TCP / IP). Если вы используете другой протокол (в чем я сомневаюсь ...), используйте соответствующую структуру.

0 голосов
/ 18 ноября 2011

Access violation reading location 0x0000000 означает, что вы получили нулевой доступ.Либо malloc возвращает нулевой указатель, так как у вас недостаточно памяти, либо у вас проблема в другом месте.Я не знаю много о программировании сокетов, но это *sockPtr= accept(...) выглядит подозрительно.

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