#include #include #include #include #include #include #define DEBUG 0 using namespace std; struct data { string text; bool do_act; data() { text = ""; do_act = false; } }; WSADATA wsd; SOCKET sSocket; struct sockaddr_in target; struct sockaddr_in income; data rcv, snd; bool END = false; void Receiver (void * dummy) { int readed = 0; char temp[1024]; int data_size = sizeof(income); while (!END) { Sleep(100); if(rcv.do_act) { data_size = sizeof(income); memset( &( temp ), '\0', 1024 ); readed = recvfrom(sSocket, (char*)&temp, 1024, 0, ( struct sockaddr * ) &income, &data_size); if(readed != SOCKET_ERROR) { rcv.text = temp; rcv.do_act = false; if (DEBUG) cout << "Received: \"" << rcv.text.c_str() << "\" | Bytes: " << readed << " | IP: " << inet_ntoa(income.sin_addr) << endl; } else { if (DEBUG) cout << "Receive ERROR: " << readed << " | ERRNO: " << WSAGetLastError() << endl; END = true; } } } _endthread(); } void Sender (void * dummy) { int sended = 0; while (!END) { Sleep(100); if(snd.do_act) { sended = sendto(sSocket, snd.text.c_str(), snd.text.size(), 0, ( struct sockaddr * ) &target, sizeof(target)); if(sended != SOCKET_ERROR) { snd.do_act = false; if (DEBUG) cout << "Data: \"" << snd.text.c_str() << "\" sended. Bytes: " << sended << endl; } else { if (DEBUG) cout << "Send ERROR: " << sended << " | ERRNO: " << WSAGetLastError() << endl; END = true; } } } _endthread(); } int main(int argc, char *argv[]) { SetConsoleTitle("NetChat > Server/Client"); string kb_input = "", target_IP = ""; printf("Podaj IP komputera do ktorego chcesz pisac: "); getline(cin, target_IP); cout << endl; if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { cout << "WSAStartup() error!!!" << endl; getch(); return 0; } sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //sSocket = socket(AF_INET, SOCK_STREAM, 0); if (sSocket == INVALID_SOCKET) { cout << "socket() error no: " << WSAGetLastError() << endl; getch(); return 0; } bool bopt = true; setsockopt(sSocket, SOL_SOCKET, SO_BROADCAST, (char*)&bopt, sizeof(bopt)); setsockopt(sSocket, SOL_SOCKET, SO_DONTLINGER, (char*)&bopt, sizeof(bopt)); target.sin_family = AF_INET; target.sin_port = htons(666); //target.sin_addr.s_addr = inet_addr( target_IP.c_str() ); target.sin_addr.s_addr = htonl( ADDR_ANY ); income.sin_family = AF_INET; income.sin_port = htons(666); income.sin_addr.s_addr = htonl( ADDR_ANY ); if ((bind(sSocket, (sockaddr*)&target, sizeof(target))) == SOCKET_ERROR){ cout << "Nie mozna podlaczyc do zdalnego komputera - zle IP" << endl; getch(); return 0; } //Rozpoczynanie wątków obsługi sieci rcv.do_act = true; _beginthread(Receiver, 0, 0); //_beginthread( Sender , 0, 0); while (!END) { Sleep(100); if(kbhit()) { cout << "Msg: "; getline(cin, kb_input); snd.text = kb_input; snd.do_act = true; Sender(NULL); } if(!rcv.do_act) { cout << "Comming: " << rcv.text.c_str() << endl; rcv.do_act = true; } } Sleep(500); return EXIT_SUCCESS; }