int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ int iResult = 0; #ifdef _MSC_VER WSADATA data; iResult = WSAStartup(MAKEWORD(2,2),&data); if(iResult != NOERROR){ ERROR_LOG(SCENET, "Wsa failed"); return iResult; } #endif metasocket = (int)INVALID_SOCKET; metasocket = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); if(metasocket == INVALID_SOCKET){ ERROR_LOG(SCENET,"invalid socket"); return -1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(27312); // Maybe read this from config too // Resolve dns addrinfo * resultAddr; addrinfo * ptr; in_addr serverIp; iResult = getaddrinfo(g_Config.proAdhocServer.c_str(),0,NULL,&resultAddr); if(iResult != 0){ ERROR_LOG(SCENET, "Dns error\n"); return iResult; } for(ptr = resultAddr; ptr != NULL; ptr = ptr->ai_next){ switch(ptr->ai_family){ case AF_INET: serverIp = ((sockaddr_in *)ptr->ai_addr)->sin_addr; } } server_addr.sin_addr = serverIp; iResult = connect(metasocket,(sockaddr *)&server_addr,sizeof(server_addr)); if(iResult == SOCKET_ERROR){ ERROR_LOG(SCENET,"Socket error"); return iResult; } memset(¶meter,0,sizeof(parameter)); strcpy((char *)¶meter.nickname.data, g_Config.sNickName.c_str()); parameter.channel = 1; // Fake Channel 1 // Prepare Login Packet getLocalMac(¶meter.bssid.mac_addr); SceNetAdhocctlLoginPacketC2S packet; packet.base.opcode = OPCODE_LOGIN; SceNetEtherAddr addres; getLocalMac(&addres); packet.mac = addres; strcpy((char *)packet.name.data, g_Config.sNickName.c_str()); memcpy(packet.game.data, adhoc_id->data, ADHOCCTL_ADHOCID_LEN); int sent = send(metasocket, (char*)&packet, sizeof(packet), 0); changeBlockingMode(metasocket,1); // Change to non-blocking if(sent > 0){ return 0; }else{ return -1; } }
int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ #ifdef _XBOX return -1; #else int iResult = 0; #ifdef _MSC_VER WSADATA data; iResult = WSAStartup(MAKEWORD(2,2),&data); // Might be better to call WSAStartup/WSACleanup from sceNetInit/sceNetTerm isn't? since it's the first/last network function being used if(iResult != NOERROR){ ERROR_LOG(SCENET, "WSA failed"); return iResult; } #endif metasocket = (int)INVALID_SOCKET; metasocket = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); if(metasocket == INVALID_SOCKET){ ERROR_LOG(SCENET,"Invalid socket"); return -1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(27312); // Maybe read this from config too // Resolve dns addrinfo * resultAddr; addrinfo * ptr; in_addr serverIp; serverIp.s_addr = INADDR_NONE; iResult = getaddrinfo(g_Config.proAdhocServer.c_str(),0,NULL,&resultAddr); if (iResult != 0) { ERROR_LOG(SCENET, "DNS error (%s)\n", g_Config.proAdhocServer.c_str()); return iResult; } for (ptr = resultAddr; ptr != NULL; ptr = ptr->ai_next) { switch (ptr->ai_family) { case AF_INET: serverIp = ((sockaddr_in *)ptr->ai_addr)->sin_addr; break; } } server_addr.sin_addr = serverIp; iResult = connect(metasocket,(sockaddr *)&server_addr,sizeof(server_addr)); if (iResult == SOCKET_ERROR) { uint8_t * sip = (uint8_t *)&server_addr.sin_addr.s_addr; ERROR_LOG(SCENET, "Socket error (%i) when connecting to %s/%u.%u.%u.%u:%u", errno, g_Config.proAdhocServer.c_str(), sip[0], sip[1], sip[2], sip[3], ntohs(server_addr.sin_port)); return iResult; } memset(¶meter,0,sizeof(parameter)); strcpy((char *)¶meter.nickname.data, g_Config.sNickName.c_str()); parameter.channel = 1; // Fake Channel 1 // Prepare Login Packet getLocalMac(¶meter.bssid.mac_addr); SceNetAdhocctlLoginPacketC2S packet; packet.base.opcode = OPCODE_LOGIN; SceNetEtherAddr addres; getLocalMac(&addres); packet.mac = addres; strcpy((char *)packet.name.data, g_Config.sNickName.c_str()); memcpy(packet.game.data, adhoc_id->data, ADHOCCTL_ADHOCID_LEN); int sent = send(metasocket, (char*)&packet, sizeof(packet), 0); changeBlockingMode(metasocket,1); // Change to non-blocking if(sent > 0){ return 0; }else{ return -1; } #endif }