From c99c11adf03b838bb3901b4ef69024f64f718e8f Mon Sep 17 00:00:00 2001 From: Tahinli <96421894+Tahinli@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:51:57 +0300 Subject: [PATCH] Client side is DONE! --- main.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++---------- start | 3 + 2 files changed, 150 insertions(+), 31 deletions(-) create mode 100755 start diff --git a/main.c b/main.c index fe54dc3..3b2e6a7 100644 --- a/main.c +++ b/main.c @@ -14,10 +14,12 @@ int cSendLength; int cRecvLength; int cRecv; - +int cRecvCommunicate; +char recvBuffer[512]; +int cSendCheck = -1; //Thread Values - +pthread_mutex_t cMutex; @@ -46,35 +48,71 @@ int cCleaner(int aloneSocket); int cSendMessageF(int clientSocket, char cMessage[]); //Threads + void *cRecvThread (void *vargp) - { - char recvBuffer[512]; + {//93.190.8.248 + printf("cRecvThread\n"); GtkTextIter cRIter; GtkTextMark *cRMark; - //GONNA FIX + GtkAdjustment *cRHeight; while(cRecv) { memset(recvBuffer, ' ', 511); recvBuffer[512] = '\0'; - cRecvLength = recv(clientSocket, recvBuffer, strlen(recvBuffer), 0); + cRecvLength = recv(clientSocket, recvBuffer, strlen(recvBuffer), MSG_DONTWAIT); recvBuffer[cRecvLength] = '\0'; - GtkTextBuffer *cOMessageRecvBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cOrderRecvTextView)); - cRMark = gtk_text_buffer_get_insert(cOMessageRecvBuffer); - gtk_text_buffer_get_iter_at_mark(cOMessageRecvBuffer, &cRIter, cRMark); - gtk_text_buffer_insert(cOMessageRecvBuffer, &cRIter, recvBuffer, -1); - g_print("%s", recvBuffer); + if(cRecvLength > 0) + { + //Thread Lock + pthread_mutex_lock(&cMutex); + GtkTextBuffer *cOMessageRecvBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cOrderRecvTextView)); + cRMark = gtk_text_buffer_get_insert(cOMessageRecvBuffer); + gtk_text_buffer_get_iter_at_mark(cOMessageRecvBuffer, &cRIter, cRMark); + gtk_text_buffer_insert(cOMessageRecvBuffer, &cRIter, recvBuffer, -1); + //gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(cOrderRecvTextView), cRMark, 0., FALSE, 0., 0.); + //Thread Unlock. + pthread_mutex_unlock(&cMutex); + g_print("%s", recvBuffer); + } + } - printf("Recv Thread will be closed\n"); + printf("\nRecv Thread will be closed\n"); pthread_exit(cRecvThread); } +//Time Based Events + +gboolean cRecvScrollRefresh(gpointer data) + { + if(cRecv) + { + GtkTextMark *cRMark; + //Thread Lock + pthread_mutex_lock(&cMutex); + GtkTextBuffer *cOMessageRecvBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cOrderRecvTextView)); + cRMark = gtk_text_buffer_get_insert(cOMessageRecvBuffer); + gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(cOrderRecvTextView), cRMark, 0., FALSE, 0., 0.); + //Thread Unlock. + pthread_mutex_unlock(&cMutex); + + return 1; + } + else + { + printf("\nAuto Scroll's Disabled\n"); + return 0; + } + } + +//Key Pressed Events +gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data); //Button Events -void cOrderSendMessage(GtkWidget *widget, gpointer data) +gboolean cOrderSendMessage(GtkWidget *widget, gpointer data) { GtkTextIter cSFirst, cSLast; GtkTextBuffer *cOMessageSendBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cOrderSendTextView)); @@ -84,6 +122,14 @@ void cOrderSendMessage(GtkWidget *widget, gpointer data) if(cSendMessageF(clientSocket, cSendMessage)) { perror("Send Failed"); + cSendCheck = 0; + return -1; + } + else + { + gtk_text_buffer_set_text(cOMessageSendBuffer, "", 0); + cSendCheck = 1; + return 0; } } void cOrderWindowCloser(GtkWidget *widget, gpointer data) @@ -94,13 +140,18 @@ void cOrderWindowCloser(GtkWidget *widget, gpointer data) void btConnectClick(GtkWidget *widget, gpointer data) { g_print("Connection Order\n"); - //Connection Call if(!connectToServer()) { printf("Threading's Starting\n"); //Multithread cRecv = 1; + //Will be deleted-- + send(clientSocket, "Kaan_Pardus", strlen("Kaan_Pardus"), 0); + sleep(0.1); + send(clientSocket, "mandalina", strlen("mandalina"), 0); + //----------------- + pthread_mutex_init(&cMutex, NULL); pthread_t cRecvThreadID; pthread_create(&cRecvThreadID, NULL, cRecvThread, NULL); @@ -111,6 +162,11 @@ void btConnectClick(GtkWidget *widget, gpointer data) cCleaner(clientSocket); } + + //Time Based Refresh + g_timeout_add_seconds(1, cRecvScrollRefresh, NULL); + + //Chat Window Definition cOrderWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -128,9 +184,21 @@ void btConnectClick(GtkWidget *widget, gpointer data) gtk_window_set_title(GTK_WINDOW(cOrderWindow), "Tahinli's Client"); gtk_window_set_resizable(GTK_WINDOW(cOrderWindow), FALSE); //TextView - gtk_widget_set_size_request(GTK_WIDGET(cOrderRecvScrollableWindow), 500, 300); + gtk_widget_set_size_request(GTK_WIDGET(cOrderRecvScrollableWindow), 500, 320); gtk_widget_set_size_request(GTK_WIDGET(cOrderSendScrollableWindow), 500, 100); gtk_text_view_set_editable(GTK_TEXT_VIEW(cOrderRecvTextView), FALSE); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(cOrderRecvTextView), FALSE); + //Auto Line Visual Fix + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(cOrderSendTextView), GTK_WRAP_WORD); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(cOrderRecvTextView), GTK_WRAP_WORD); + + //Catching Key Events in TextView + g_signal_connect(G_OBJECT(cOrderSendTextView), "key_press_event", G_CALLBACK(on_key_press), NULL); + + + + + //Pane Set gtk_fixed_put(GTK_FIXED(cOrderPane), cOrderRecvScrollableWindow, 10, 10); @@ -218,7 +286,6 @@ int main(int argc, char **argv) { printf("Hello World\n"); - gtk_init(&argc,&argv); // @@ -269,8 +336,6 @@ int main(int argc, char **argv) gtk_main(); - - return 0; } @@ -332,7 +397,7 @@ int socketCloser(int aloneSocket) } else { - printf("Socket is Closed\n"); + printf("\nSocket is Closed\n"); return 0; } @@ -341,6 +406,7 @@ int cCleaner(int aloneSocket) { cRecv = 0; socketCloser(aloneSocket); + pthread_mutex_destroy(&cMutex); gtk_widget_show(cWindow); gtk_widget_set_sensitive(GTK_WIDGET(btConnect), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(ipEntry), TRUE); @@ -349,23 +415,73 @@ int cCleaner(int aloneSocket) } int cSendMessageF(int clientSocket, char cMessage[]) { - char cSendBuffer[512]; - + if(strlen(cMessage)<512) - { - strncpy(cSendBuffer, cMessage, strlen(cMessage)); - cSendBuffer[strlen(cMessage)] = '\0'; - cSendLength=send(clientSocket, cSendBuffer, strlen(cSendBuffer), 0); - if(cSendLength!=strlen(cMessage)) { - perror("Send Failed"); - return -1; + int isEmpyty = -1; + int lastLetter = -1; + //is Empty + for(int i = 0; i < strlen(cMessage); i++) + { + if(isEmpyty == -1 && cMessage[i] != 10 && cMessage[i] != 32 && cMessage[i] != 9) + { + isEmpyty = i; + printf("BOŞ\n"); + } + if(isEmpyty != -1 && cMessage[i] != 10 && cMessage[i] != 32 && cMessage[i] != 9) + { + lastLetter = i; + printf("DEGIL\n"); + } + } + if(isEmpyty != -1) + { + char cSendBuffer[512]; + for(int i = 0; i < lastLetter-isEmpyty+1; i++) + { + cSendBuffer[i] = cMessage[isEmpyty+i]; + } + cSendBuffer[lastLetter+1] = '\0'; + for(int i = 0; i < strlen(cSendBuffer); i++) + { + printf("%c--%d\n", cSendBuffer[i], cSendBuffer[i]); + } + cSendLength=send(clientSocket, cSendBuffer, strlen(cSendBuffer), 0); + if(cSendLength != strlen(cSendBuffer)) + { + perror("Send Failed"); + return -1; + } + } + else + { + printf("\nEmpyt\n"); + return -1; + } } - return 0; - } else { - printf("Too Long\n"); + printf("\nToo Long\n"); return -1; } + printf("\nEverything is OK\n"); + return 0; + + } + + +//Key Pressed Events +gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) + { + switch(event->keyval) + { + case GDK_KEY_Return: + cOrderSendMessage(widget, data); + return 1; + break; + + default: + NULL; + } + return 0; } \ No newline at end of file diff --git a/start b/start new file mode 100755 index 0000000..e4810d7 --- /dev/null +++ b/start @@ -0,0 +1,3 @@ +gcc main.c -o main `pkg-config --cflags --libs gtk+-3.0` -lpthread +./main +clear \ No newline at end of file