我会保持简单 代码:
#include "stdafx.h"
#include <winsock2.h>
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
if(error) printf("WinSock error!");
SOCKET server;
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5657);
server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
server = socket(AF_INET, SOCK_STREAM, 0);
if (server == INVALID_SOCKET) printf("INVALID SOCKET!");
error = bind(server, (LPSOCKADDR)&server_addr, sizeof(server_addr));
if(error) printf("Connect Error!");
listen(server, SOMAXCONN);
printf("SERVER ESTABLISHED! LISTENING...\n");
sockaddr_in client_addr;
SOCKET client;
client = accept(server, (struct sockaddr*)&client_addr, (int *)sizeof(client_addr));
if(client==INVALID_SOCKET) printf("INVALID SOCKET!\n");
printf("A CLIENT!");
closesocket(server);
WSACleanup();
getch();
return 0;
}
但我得到的是:
SERVER ESTABLISHED!聆听... 无效的插座! 客户!
我在C#中完成了套接字,我猜服务器应该监听并等待客户端,每当客户端请求连接时,服务器都应该接受它,但服务器接受套接字而不等待,这个被接受的套接字也是无效的!为什么会发生这种情况,我该如何解决?
答案 0 :(得分:4)
此:
(int *)sizeof(client_addr)
错误,你将大小转换为指针。
socklen_t client_addr_len = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);
答案 1 :(得分:1)
(int *)sizeof(client_addr)
您将client_addr大小转换为int *,因此您有一个指针指向一个等于client_addr大小的地址。
你需要这样做:
socklen_t clntAddrLen = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen);
这种方式不同,因为你有一个类型为socklen_t的变量,它保存了client_addr的大小。然后你得到一个指针(带有&amp;)指向包含该数字的内存地址,这就是你想要的。
答案 2 :(得分:1)
问题可能是accept将尝试写入提供给它的最后一个参数。
更改为:
int client_addr_size = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size);
检查WSAGetLastError的值将提供失败的原因。