2
votes

I am working on a C++ UDP program, that sends a string to another client and should receive an answer.

Sending works fine, but i cant receive any packets. I looked with wireshark and my computer receives the packet at the right port and from the right IP, but my program seems to ignore them.

Do you have any idea?

int startWinsock(void);
int main()
{
long receive;
SOCKET sock;
char buffer[256];
SOCKADDR_IN si_me;
SOCKADDR_IN si_other;

///////////// Start Winsock ///////////////
receive = startWinsock();
if (receive != 0)
{
    printf("Error: startWinsock, error code: %d\n", receive);
    return 1;
}
else
{
    printf("Winsock started!\n");
}

//////////// Create UDP Socket //////////////
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
    printf("Fehler: Socket could not be created, errorcode: %d\n", WSAGetLastError());
    return 1;
}
else
{
    printf("UDP Socket created!\n");
}

si_me.sin_family = AF_INET;
si_me.sin_port = htons(1198);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);

si_other.sin_family = AF_INET;
si_other.sin_port = htons(2000);
si_other.sin_addr.s_addr = inet_addr("10.2.134.10");

receive = connect(sock, (SOCKADDR*)&si_other, sizeof(SOCKADDR));

if (receive == SOCKET_ERROR)
{
    cout << "Error : Connection Failed, Errorcode: " << WSAGetLastError() << endl;
}
else
{
    cout << "Connected to" << si_other.sin_addr.s_addr << endl;
}
static int timeout = 500;

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
//  char broadcast = 1;
//  setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));

while (1)
{
    printf("Insert Text: ");
    gets(buffer);
    //rc = sendto(s, buf, strlen(buf), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
    receive = send(sock, buffer, strlen(buffer), 0);
    if (receive == SOCKET_ERROR)
    {
        //printf("error: sendto, error code: %d\n",WSAGetLastError());
        printf("Error: send, error code: %d\n", WSAGetLastError());
        //return 1;
    }
    else
    {
        printf("%d bytes sent!\n", receive);
    }
    static int timeout = 500;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
    int wait = 0;
    while (wait == 0)
    {
        //rc = recvfrom(s, buf, 256, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
        receive = recv(sock, buffer, sizeof(buffer), 0);
        if (receive == SOCKET_ERROR)
        {
            //printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError());
            printf("Fehler: recv, fehler code: %d\n", WSAGetLastError());
            //return 1;
        }
        else
        {
            wait = 1;
            printf("%d bytes received!\n", receive);
            buffer[receive] = '\0';
            printf("Received: %s\n", buffer);
        }
    }
}

getchar();
return 0;
}


int startWinsock(void)
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2, 0), &wsa);
}
2
What error do you get?user207421

2 Answers

0
votes

To make it so your code works nearly as-is by sending to itself, do the following:

  • change the "me" port to match "other"... si_me.sin_port = htons( 2000 );
  • bind to it... bind( sock, (SOCKADDR*)&si_me, sizeof( SOCKADDR ) ); just before connect
-1
votes

As UDP is Datagram-Oriented and connectionless, you need to use recvfrom/sento instead of recv/send. Also the receivetimeout should be set with at timeval.

struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));