Cannot do network programming in XCode anymore

73 Views Asked by At

Until recently, the following code worked perfectly in my project. But since a few days ago, it no longer works. I can replace the NSLog statements with printf statements, replace the other Obj-C style statements and compile with g++ in terminal it works just fine.

It should just connect to a very primitive server on a Raspberry Pi, send a single character 'R', and read back a 2-Byte integer. When I compiled or ran it in XCode months ago it worked. When I compile now in terminal with g++ it works. When I run in XCode now, though, it fails to open the socket and reports setDAC: connection failed.

I fear I may be going insane. Did Apple hide some new setting I need to turn on network access in XCode 9.4.1? Any advice?

Previously functional code in XCode:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include "stdio.h"

.
.
.

float readDAC(uint8_t ch){
if(!isConnected){
    const char *servIP = [[txtIPAddress stringValue] UTF8String];

    in_port_t servPort = 5001;

    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock < 0){
        NSLog(@"setDAC: Socket creation failed\n");
        ok = false;
    }
    struct sockaddr_in servAddr;

    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    int rtnVal = inet_pton(AF_INET, servIP, &servAddr.sin_addr.s_addr);
    if(ok){
        if(rtnVal == 0){
            NSLog(@"setDAC: inet_pton() failed: invalid address string\n");
            ok = false;
        }
        else if (rtnVal < 0){
            NSLog(@"setDAC: inet_pton() failed\n");
            ok = false;
        }
        servAddr.sin_port = htons(servPort);
    }
    if(ok) if(connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0){
        NSLog(@"setDAC: connection failed\n");
        ok = false;
    }

    datastream = fdopen(sock, "r+");
    isConnected = true;
}
//send 'R' to read
//send 'W' to write
char writeChar = 'R';

if([AD5754 intValue]==1){
    uint8_t writeChannel;
    int16_t setVal;

    float theVal;

    uint8_t nDAC = 0;
    if(ch>3) nDAC = 1;
    ch = ch%4;
    ch = 16*nDAC+ch;
    writeChannel = ch;

    fwrite(&writeChar, sizeof(writeChar), 1, datastream);
    fwrite(&writeChannel, sizeof(writeChannel), 1, datastream);
    fread(&setVal, sizeof(setVal), 1, datastream);

    int16_t theSetVal;
    theSetVal = ntohs(setVal);

    theVal = (float)theSetVal/100;

    NSLog(@"Read channel %i: %0.2f", ch, theVal);
    fflush(datastream);
    fclose(datastream);

    return theVal;

}

1

There are 1 best solutions below

0
On

I paid Apple the $99 annual fee to join the developer program and now the network coding works again. Not impressed with Apple, but ok.

I wouldn't mind paying to recover the functionality if it was documented or some notice was given. But I struggled for a few days before getting desperate enough to try throwing money at the problem, randomly.