2013-04-30 3 views
0

Я пытаюсь отправить изображения (используя библиотеку IlpImage) в VLan (медиаплеер) через сеть, чтобы он мог воспроизводить потоковые изображения и «делать» видео.Не удается открыть сокет C++

Я пытаюсь открыть сокет, но значение «serversock» всегда дает мне -1, и я не понимаю, почему. Я пытаюсь найти эту ошибку, но не могу найти решение. Кто-нибудь может мне помочь?

Вот код:

#include <stdio.h> 
#include <stdlib.h> 
#include <direct.h> 
#include <iostream> 
#include <WinSock2.h> 
#include <Windows.h> 
#include <iostream> 
#include <string.h> 
#include <time.h> 
#include <errno.h> 
//#include <fstream> 

//#include "Packet.h" 

#include <opencv2/core/core.hpp>  // Basic OpenCV structures (cv::Mat, Scalar) 
#include <opencv2/highgui/highgui.hpp> // OpenCV window I/O 

using namespace std; 

#define PORT 8888 
#define GROUP "127.0.0.1" 

int serversock, clientsock; 
int is_data_ready = 0; 

//methods 
void quit(char* msg, int retval); 
void sendImg (IplImage *img); 

void sendImg(IplImage *img) { 

    struct sockaddr_in server; 
    int opt = 1; 

    /* setup server's IP and port */ 
    memset(&server,0,sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = inet_addr(GROUP); 
    server.sin_port = htons(PORT); 

    //serversock = socket(AF_INET, SOCK_STREAM, 0); 

    serversock = socket(AF_INET, SOCK_DGRAM, 0); 

Хотя debbuging значение serversock должно быть 0, и он получает -1, а не в соответствии с программой.

if (serversock < 0) { // or == -1 
     quit("socket() failed", 1); 
    } //else {cout<< "Consegui!" << endl 

    cout << "socket() succeeded" << endl; 

    if(setsockopt(serversock,SOL_SOCKET,SO_BROADCAST, (const char*) &opt,sizeof(int))==-1){ 
     quit("setsockopt failed",0); 
    } 

    /* 
    memset(&server, 0, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(PORT); 
    server.sin_addr.s_addr = INADDR_ANY;*/ 

    /* bind the socket */ 
    if (bind(serversock, (const sockaddr*)&server, sizeof(server)) == -1) { 
     quit("bind() failed", 1); 
    } 

    /* wait for connection */ 
    if (listen(serversock, 10) == -1) { 
     quit("listen() failed.", 1); 
    } 

    /* accept a client */ 
    if ((clientsock = (int)accept(serversock, NULL, NULL)) == -1) { 
     quit("accept() failed", 1); 
    } 

    /* the size of the data to be sent */ 
    int imgsize = img->imageSize; 
    int bytes=0; 

    //start sending images 
    if (is_data_ready) { 
     is_data_ready = 0; 
     if((bytes = sendto(serversock, img->imageData, imgsize, 0, (struct sockaddr*)&server, sizeof(server))) == -1) { 
      quit("sendto FAILED", 1); 
     } 
    } 
} 

ответ

1

WSAGetLastError() Используйте, чтобы определить причину сбоя:

if (serversocket < 0) 
{ 
    const DWORD last_error = WSAGetLastError(); 
    // Pass 'last_error' to either the 'quit' function 
    // or log it somewhere else. 
} 

WSAStartup() нет в размещенном коде, и она должна быть вызвана перед использованием любой из функций API сокета.

+0

Благодаря hmjd, он работал на открытие сокета, но теперь у меня есть другая ошибка здесь: 'если (setsockopt (serversock, SOL_SOCKET, SO_BROADCAST (Const символ *) и выбрать, SizeOf (INT)) == - 1) { Сбой wprintf (L "с ошибкой:% ld \ n", WSAGetLastError()); WSACleanup(); quit ("setsockopt failed", 0); } '}' И приложение говорит мне: 'socket failed с ошибкой: 10042' Я собираюсь выполнить поиск этой ошибки. – xatz

+0

Похоже на ошибку протокола WSAENOPROTOOPT. Я перешел из 'serversocket = socket (AF_INET, SOCK_STREAM, 0)' в 'serversocket = socket (AF_INET, SOCK_DGRAM, 0)' и он работал :) – xatz