在accept()之后发送数据

时间:2015-07-29 13:19:42

标签: c sockets

我已经编写了一个接受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;
}

2 个答案:

答案 0 :(得分:1)

'(socklen_t *)sizeof(他们的)' - 不,坏演员。 sizeof(他们的)就像20-ish一样,解除引用地址20-ish在大多数系统上都是非法的。

尝试:

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

注意:在调用之后你可能需要sLen,比如在返回的对等地址的末尾推送一个null,(不确定是否有一个被accept调用放入)。

答案 1 :(得分:0)

您永远不会将newsockd分配给accept的结果。

accept返回与客户端套接字相关的新文件描述符。

将您的代码更改为:

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