int main()
{
CRc5 dec;
WSADATA wsaData;
int err;
if((err =WSAStartup(0x0002, &wsaData)) !=0)
{
printf("Init WSAStartup() failed[%d].", err);
return false;
}
//socket structure
SOCKADDR_IN addr;//addr = socket structure
int addrlen = sizeof(addr);
//making the socket
SOCKET sListen;//listenig to the incoming connections
SOCKET sConnect;//operating the connection
//setuping the socket
sConnect=socket(AF_INET,SOCK_STREAM,NULL);//sock_stream = that the socket is a connection_oriented
//setup the structure
addr.sin_addr.s_addr=inet_addr("127.0.0.1");// ip of the connection
addr.sin_family= AF_INET;
//seting the prot
addr.sin_port= htons(9958);
//sertuping Listen socket
sListen=socket(AF_INET,SOCK_STREAM,NULL);
//binding connection
bind(sListen,(SOCKADDR*)&addr,sizeof(addr));
//listening
listen(sListen,SOMAXCONN);//listing with out any limit
printf("Attempting Socket Connection\n");
printf("Wating For An Incoming Connection!\n");
for(;;)
{
if((sConnect=accept(sListen,(SOCKADDR*)&addr,&addrlen)) != INVALID_SOCKET)
{
char buf[500];
int len = strlen(buf);
recv(sConnect,buf,len,0);
}
else
{
printf("Error accepting %d\n",WSAGetLastError());
}
}
}
但是它没有收到任何接受来自游戏客户端的套接字的东西,然后没有发生任何事情的原因!!?
答案 0 :(得分:1)
char buf[500];
int len = strlen(buf);
recv(sConnect,buf,len,0);
strlen(buf)
显然是错误的。不知道这是recv()
不起作用的原因,但您应该肯定使用sizeof(buf)
。
您还应该知道recv(socket, buf, 500, 0)
不一定会收到500个字节,即使发件人发送了500个字节。它可能只接收1个字节或任何数字最多 500。
此外,它不一定会收到发件人通过单个send()
电话发送的所有内容。套接字纯粹是一个流,没有消息边界。
我只是提到这两件事,因为它们是初学者用插座制作的“头号错误”。
答案 1 :(得分:0)
{
if((sConnect=accept(sListen,(SOCKADDR*)&addr,&addrlen)) != INVALID_SOCKET)
{
char buf[500];
int len = strlen(buf);
recv(sConnect,buf,len,0);
}
您可能不应该重复使用addr
来查找传入连接的地址。可能没有任何错误的,但是知道你在程序中对两个不同的东西使用相同的变量会越大,你的程序就越大。为每个变量赋予一个特定的任务,并且只有充分理由才能重用变量。
但问题很可能是strlen(buf)
致电。没有任何内容将您在堆栈上分配的char buf[500]
归零。如果strlen()
字节偶然位于该位置,您的0
可能会返回0
,或者2000
可能会返回0
,如果这是必须查看的字节数在找到12
字节之前通过。 (我猜想像sizeof buf;
这样的东西会很常见。:)你可以使用malloc
,但如果你改变主意并使用recv()
分配数组,这可能会很脆弱。因此,只需对分配中的长度和{{1}}调用使用常量。当你决定将来变得充满活力时,很难想象它。