一旦包含外部源,Winsock无效套接字错误

时间:2017-06-12 16:36:28

标签: sockets winsock crypto++

我正在尝试创建服务器/客户端通信控制台,但是一旦我包含外部库(cryptopp)和调试,它将始终因套接字无效错误而终止。我不知道发生了什么。

#include <iostream>
#include <WS2tcpip.h>
#include <string>

#pragma comment (lib, "ws2_32.lib")

#include "../cryptopp565/sha.h"
using CryptoPP::SHA1;


using namespace std;


int main()
{
//initialize winsock
WSADATA wsData;
WORD ver = MAKEWORD(2, 2);

int wsOk = WSAStartup(ver, &wsData);
if (wsOk != 0)
{
    cerr << "Can't Initialize winsock! program terminate." << endl;
    return 1;
}

//create a socket 
SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
if (listening == INVALID_SOCKET)
{
    cerr << "Can't create a socket! program terminate." << endl;
    return 1;
}

//Promtp to get server port
string server_port_temp;

cout << "Enter port : ";
cin >> server_port_temp;

int server_port = stoi(server_port_temp);

//bind the ip address and port to a socket 
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(server_port);
hint.sin_addr.S_un.S_addr = INADDR_ANY;

bind(listening, (sockaddr*)&hint, sizeof(hint));

//tell winsock the socket is for listening 
listen(listening, SOMAXCONN);

//wait for connection
sockaddr_in client;
int clientSize = sizeof(client);

SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
if (clientSocket == INVALID_SOCKET)
{
    cerr << "Invalid socket ! program terminate." << endl;
    return 1;
}

char host[NI_MAXHOST];        //client remote name
char service[NI_MAXHOST];     // service (poet client is connect on)

ZeroMemory(host, NI_MAXHOST);
ZeroMemory(service, NI_MAXHOST);

if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXHOST, 0) == 0)
{
    cout << host << " Connect on port " << service << endl;
}
else
{
    inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);
    cout << host << " Connected on port " << ntohs(client.sin_port) << endl;
}

//close listening socket
closesocket(listening);

//while loop: communication
char buf[4096];


//communicate ________________
while (true)
{
    ZeroMemory(buf, 4096);

    //wait for client to send data
    int bytesReceived = recv(clientSocket, buf, 4096, 0);
    if (bytesReceived == SOCKET_ERROR)
    {
        cerr << "Error in recv(). Program terminate." << endl;
        break;
    }

    if (bytesReceived == 0)
    {
        cout << "Client disconnected " << endl;
        break;
    }

    cout << string(buf, 0, bytesReceived) << endl;

    //echo message back to client
    send(clientSocket, buf, bytesReceived + 1, 0);
}

//close the socket
closesocket(clientSocket);

//clean winsock
WSACleanup();

system("pause");
return 0;

}`

0 个答案:

没有答案