std::exception 正在启动服务器 (WinSock2)
std::exception while starting server (WinSock2)
我是 C++ 的新手,目前正在学习 tutorial 如何使用 winsock(2)。
但是我 运行 我的服务器出了问题。我不知道它是怎么发生的。
#include "stdafx.h"
#include <WinSock2.h>
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
void cmdError(string e = ""){
cout << "Error:\n" << e << endl;
chrono::milliseconds t( 3000 );
this_thread::sleep_for( t );
}
void startServer(int port){
SOCKET acceptSocket;
SOCKET connectedSocket;
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=ADDR_ANY;
memset(&addr, 0, sizeof(SOCKADDR_IN));
long rc;
acceptSocket = socket(AF_INET, SOCK_STREAM, 0);
if(acceptSocket = INVALID_SOCKET){ throw new exception();}
rc = ::bind(acceptSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR_IN));
if(rc == SOCKET_ERROR){ throw new exception();}
rc = listen(acceptSocket, 10);
if(rc == SOCKET_ERROR){ throw new exception();}
connectedSocket = accept(acceptSocket, NULL, NULL);
if(connectedSocket == INVALID_SOCKET){ throw new exception();}
}
void startClient(string ip, int port){
long rc;
SOCKADDR_IN addr;
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if(s == INVALID_SOCKET){ throw new exception();}
memset(&addr, 0, sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip.c_str());
rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if(s == SOCKET_ERROR){ throw new exception();}
}
int _tmain(int argc, _TCHAR* argv[]){
WSADATA wsa;
if(WSAStartup(MAKEWORD(2, 0), &wsa) != 0){
cmdError();
return 1;
}
string n;
int port;
cout << "Please specify the task of this thread. \nEnter 'server' or 'client'." << endl;
getline(cin, n);
system("cls");
cout << "Please specify a port." << endl;
cin.clear();
cin.sync();
cin >> port;
system("cls");
if(n.at(0) == 'c' || n.at(0) == 'C'){
string ip;
cout << "You started a client application." << endl;
cout << "Enter the IP address of the server you want to connect to." << endl;
cin.clear();
cin.sync();
getline(cin, ip);
system("cls");
cmdError();
try{
startClient(ip, port);
}
catch(exception e){
cmdError();
e.~exception();
return 1;
}
return 0;
}
else if(n.at(0) == 's' || n.at(0) == 'S'){
cout << "You started a server application" << endl;
try {
startServer(port);
}
catch(exception e){
e.~exception();
return 1;
}
return 0;
}
cmdError();
return 1;
}
void sendStr(string msg){
}
当我通过应用程序启动我的服务器时,我在 void startServer(int port)
中收到以下错误弹出窗口。
First-chance exception at 0x7667C42D in test.exe: Microsoft C++ exception:
std::exception at memory location 0x001EF5C8.
If there is a handler for this exception, the progrram may be safely continued.
知道为什么会这样吗?
你没有接住你扔的东西。您正在抛出 exception *
并试图抓住 exception
.
你几乎不应该抛出一个 new
异常,你应该只抛出一个异常,然后你应该捕获对所述异常的常量引用,例如:
#include <exception>
#include <iostream>
int
x(int y)
{
throw std::exception();
}
int
main(int argc, char **argv)
{
try {
x(2);
} catch (const std::exception &e) {
std::cout << "Oops" << std::endl;
}
return 0;
}
如果我使用了你的代码,我会因为 std::exception *
类型的未捕获异常而终止程序(请注意,它是指向 std::exception
的指针,而不是 std::exception
。
另外,我不知道你想用 e.~exception();
完成什么。它在该代码中没有位置。如果你试图删除你有 new
d 的异常,那么你应该 delete
它。像这样显式调用析构函数表明您在理解对象生命周期方面遇到困难;这是 C++
语言的基本组成部分。
Charles Bailey's answer to this question goes into some detail on the whys and whats of this also.
我是 C++ 的新手,目前正在学习 tutorial 如何使用 winsock(2)。
但是我 运行 我的服务器出了问题。我不知道它是怎么发生的。
#include "stdafx.h"
#include <WinSock2.h>
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
void cmdError(string e = ""){
cout << "Error:\n" << e << endl;
chrono::milliseconds t( 3000 );
this_thread::sleep_for( t );
}
void startServer(int port){
SOCKET acceptSocket;
SOCKET connectedSocket;
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=ADDR_ANY;
memset(&addr, 0, sizeof(SOCKADDR_IN));
long rc;
acceptSocket = socket(AF_INET, SOCK_STREAM, 0);
if(acceptSocket = INVALID_SOCKET){ throw new exception();}
rc = ::bind(acceptSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR_IN));
if(rc == SOCKET_ERROR){ throw new exception();}
rc = listen(acceptSocket, 10);
if(rc == SOCKET_ERROR){ throw new exception();}
connectedSocket = accept(acceptSocket, NULL, NULL);
if(connectedSocket == INVALID_SOCKET){ throw new exception();}
}
void startClient(string ip, int port){
long rc;
SOCKADDR_IN addr;
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if(s == INVALID_SOCKET){ throw new exception();}
memset(&addr, 0, sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip.c_str());
rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if(s == SOCKET_ERROR){ throw new exception();}
}
int _tmain(int argc, _TCHAR* argv[]){
WSADATA wsa;
if(WSAStartup(MAKEWORD(2, 0), &wsa) != 0){
cmdError();
return 1;
}
string n;
int port;
cout << "Please specify the task of this thread. \nEnter 'server' or 'client'." << endl;
getline(cin, n);
system("cls");
cout << "Please specify a port." << endl;
cin.clear();
cin.sync();
cin >> port;
system("cls");
if(n.at(0) == 'c' || n.at(0) == 'C'){
string ip;
cout << "You started a client application." << endl;
cout << "Enter the IP address of the server you want to connect to." << endl;
cin.clear();
cin.sync();
getline(cin, ip);
system("cls");
cmdError();
try{
startClient(ip, port);
}
catch(exception e){
cmdError();
e.~exception();
return 1;
}
return 0;
}
else if(n.at(0) == 's' || n.at(0) == 'S'){
cout << "You started a server application" << endl;
try {
startServer(port);
}
catch(exception e){
e.~exception();
return 1;
}
return 0;
}
cmdError();
return 1;
}
void sendStr(string msg){
}
当我通过应用程序启动我的服务器时,我在 void startServer(int port)
中收到以下错误弹出窗口。
First-chance exception at 0x7667C42D in test.exe: Microsoft C++ exception:
std::exception at memory location 0x001EF5C8.
If there is a handler for this exception, the progrram may be safely continued.
知道为什么会这样吗?
你没有接住你扔的东西。您正在抛出 exception *
并试图抓住 exception
.
你几乎不应该抛出一个 new
异常,你应该只抛出一个异常,然后你应该捕获对所述异常的常量引用,例如:
#include <exception>
#include <iostream>
int
x(int y)
{
throw std::exception();
}
int
main(int argc, char **argv)
{
try {
x(2);
} catch (const std::exception &e) {
std::cout << "Oops" << std::endl;
}
return 0;
}
如果我使用了你的代码,我会因为 std::exception *
类型的未捕获异常而终止程序(请注意,它是指向 std::exception
的指针,而不是 std::exception
。
另外,我不知道你想用 e.~exception();
完成什么。它在该代码中没有位置。如果你试图删除你有 new
d 的异常,那么你应该 delete
它。像这样显式调用析构函数表明您在理解对象生命周期方面遇到困难;这是 C++
语言的基本组成部分。
Charles Bailey's answer to this question goes into some detail on the whys and whats of this also.