【发布时间】:2015-07-02 12:19:24
【问题描述】:
只是想用winsock打开一个套接字。我从 Visual Studio 收到一条错误消息,指出我在 ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 上存在读取访问冲突
我的整个代码都在那里:
ListenSocket = INVALID_SOCKET;
ClientSocket = INVALID_SOCKET;
WORD wVersionRequested;
WSADATA wsaData;
int wsaerr;
wVersionRequested = MAKEWORD(2, 2);
wsaerr = WSAStartup(wVersionRequested, &wsaData);
if (wsaerr != 0)
{
printf("Server: The Winsock dll not found!\n");
WSACleanup();
return 0;
}
else
{
printf("Server: The Winsock2 dll found \n");
}
/* SOCKET is simply a UINT, created because
on Unix sockets are file descriptors(UINT) but not in windows
so new type SOCKET was created */
cout << AF_INET << endl ;
cout << SOCK_STREAM << endl ;
cout << IPPROTO_TCP << endl ;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ListenSocket == INVALID_SOCKET)
{
cerr << "Server: Error initializing socket!n" << endl;
WSACleanup();
return 0;
}
/* The SOCKADDR_IN structure is used by
Win Sockets to specify an endpoint address
to which the socket connects */
sockaddr_in service,client ;
service.sin_family = AF_INET;
service.sin_port = htons(port);
service.sin_addr.s_addr = INADDR_ANY;
/* bind just links the socket
with the sockaddr_in struct we initialized */
if(bind(ListenSocket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
printf("Server: Error binding socket to port \n");
WSACleanup();
return 0;
}
/* wait for incoming connections */
if(listen(ListenSocket,10)==SOCKET_ERROR)
printf("listen(): Error listening on socket %d\n", WSAGetLastError());
else
{
printf("Server: Waiting for connections...\n");
}
/* accept connections */
printf("Server: Waiting for a client to connect...\n");
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
} else {
wprintf(L"Client connected.\n");
acceptConns();
}
很想得到一些帮助,因为我不知道为什么它不起作用。
提前致谢
编辑:我正在使用以下代码在线程中创建该服务器。看来这就是我首先收到错误的原因
DWORD WINAPI myThread(LPVOID lpParameter)
{
tcp_server* server = (tcp_server*)lpParameter ;
server->start_listening(); // The above function
return 0 ;
}
.....
HANDLE myHandle = CreateThread(0, 0, myThread, server, 0,NULL);
【问题讨论】:
-
你有没有按照微软官方教程的建议改用
getaddrinfo返回的参数? msdn.microsoft.com/en-us/library/windows/desktop/… -
我有但是getaddrinfo函数没有定义
-
你包括哪个 WinSock 标头?
-
啊,原来 getaddrinfo 是在
中声明的。你也加入了那个吗? -
能否请您发布
tcp_server类的或多或少完整的定义?
标签: c++ multithreading sockets winsock2