2015-07-29 2 views
-1

Я написал небольшой сервер, который принимает подключения в c.it, просто принимает соединение и должен отправлять данные, когда соединение принято. Но это не так!
принимает соединение, но никогда не отправляет никаких данных (строки после вызова accept() никогда не выполняются).отправка данных после принятия()

//Server! 
#include <stdio.h> 
#include <iostream> 
#include <WinSock2.h> 
#include <WS2tcpip.h> 
#pragma comment(lib,"WS2_32.lib") 
using namespace::std; 
int main(int argc, char **argv){ 
    int sockd,newsockd,status=0; 
    WSADATA ws; 
    WSAStartup(MAKEWORD(2, 2),&ws); 
    struct addrinfo hints, *res; 
    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    cout<<getaddrinfo("127.0.0.1", "6164", &hints, &res)<<endl; 
    sockd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 
    cout<<"SOCKET NUMBER="<<sockd<<endl; 
    cout << "BIND STATUS=" << bind(sockd,res->ai_addr, res->ai_addrlen)<<endl; 
    status = listen(sockd, 16); 
    if (status >= 0){ 
     cout << "Now Listening On Port 6164 TCP!"<<endl; 
    } 
    else{ 
     return WSAGetLastError(); 
    } 
    struct sockaddr_storage theirs; 
    newsockd=accept(sockd, (struct sockaddr*)&theirs,(socklen_t*) sizeof(theirs)); 
    send(newsockd, "Hello!", 18, 0); 
    getchar(); 
    return 0; 
} 
+0

Наиболее читаемый код с давних времен .... – ckruczek

+0

@ckruczek, так что проблема в ...? –

+0

Лучше читайте, как лучше форматировать свой код в своем вопросе, чтобы вы могли ответить на вопрос. Хотя гораздо проще прочитать ваш вопрос и получить основную часть вашего кода. – ckruczek

ответ

1

'(socklen_t *) SizeOf (их)' - нет, плохой бросок. sizeof (их), как 20-ий, и адрес разыменования 20-ish является незаконным в большинстве систем.

Try:

socklen_t sLen=sizeof(theirs); 
.. 
newsockd=accept(sockd, (struct sockaddr*)&theirs,&sLen); 

Примечание: Вам может понадобиться SLEN после вызова, скажем, засунуть нуль в конце возвращаемого адреса сверстников (не уверен, что если один получает положить в акцепт вызов).

0

Вы никогда не назначать newsockd результату accept.

accept возвращает новый файловый дескриптор, связанный с клиентским сокетом.

Изменить код:

newsockd = accept(sockd, (struct sockaddr*)&theirs,(socklen_t*) sizeof(theirs)); 
+0

извините забыл вставить правильный код Программа компилируется в порядке. –

+0

«* Измените свой код на: *« нет, поскольку этот «*' (socklen_t *) sizeof (их)) '*" является убийцей. – alk

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