我已经编写了一个接受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 :(得分: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));