Client side is DONE!
This commit is contained in:
parent
f7d02e3306
commit
c99c11adf0
2 changed files with 150 additions and 31 deletions
178
main.c
178
main.c
|
@ -14,10 +14,12 @@
|
||||||
int cSendLength;
|
int cSendLength;
|
||||||
int cRecvLength;
|
int cRecvLength;
|
||||||
int cRecv;
|
int cRecv;
|
||||||
|
int cRecvCommunicate;
|
||||||
|
char recvBuffer[512];
|
||||||
|
int cSendCheck = -1;
|
||||||
|
|
||||||
//Thread Values
|
//Thread Values
|
||||||
|
pthread_mutex_t cMutex;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,35 +48,71 @@ int cCleaner(int aloneSocket);
|
||||||
int cSendMessageF(int clientSocket, char cMessage[]);
|
int cSendMessageF(int clientSocket, char cMessage[]);
|
||||||
|
|
||||||
//Threads
|
//Threads
|
||||||
|
|
||||||
void *cRecvThread (void *vargp)
|
void *cRecvThread (void *vargp)
|
||||||
{
|
{//93.190.8.248
|
||||||
char recvBuffer[512];
|
|
||||||
printf("cRecvThread\n");
|
printf("cRecvThread\n");
|
||||||
GtkTextIter cRIter;
|
GtkTextIter cRIter;
|
||||||
GtkTextMark *cRMark;
|
GtkTextMark *cRMark;
|
||||||
//GONNA FIX
|
GtkAdjustment *cRHeight;
|
||||||
while(cRecv)
|
while(cRecv)
|
||||||
{
|
{
|
||||||
memset(recvBuffer, ' ', 511);
|
memset(recvBuffer, ' ', 511);
|
||||||
recvBuffer[512] = '\0';
|
recvBuffer[512] = '\0';
|
||||||
cRecvLength = recv(clientSocket, recvBuffer, strlen(recvBuffer), 0);
|
cRecvLength = recv(clientSocket, recvBuffer, strlen(recvBuffer), MSG_DONTWAIT);
|
||||||
recvBuffer[cRecvLength] = '\0';
|
recvBuffer[cRecvLength] = '\0';
|
||||||
GtkTextBuffer *cOMessageRecvBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cOrderRecvTextView));
|
if(cRecvLength > 0)
|
||||||
cRMark = gtk_text_buffer_get_insert(cOMessageRecvBuffer);
|
{
|
||||||
gtk_text_buffer_get_iter_at_mark(cOMessageRecvBuffer, &cRIter, cRMark);
|
//Thread Lock
|
||||||
gtk_text_buffer_insert(cOMessageRecvBuffer, &cRIter, recvBuffer, -1);
|
pthread_mutex_lock(&cMutex);
|
||||||
g_print("%s", recvBuffer);
|
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);
|
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
|
//Button Events
|
||||||
void cOrderSendMessage(GtkWidget *widget, gpointer data)
|
gboolean cOrderSendMessage(GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
GtkTextIter cSFirst, cSLast;
|
GtkTextIter cSFirst, cSLast;
|
||||||
GtkTextBuffer *cOMessageSendBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cOrderSendTextView));
|
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))
|
if(cSendMessageF(clientSocket, cSendMessage))
|
||||||
{
|
{
|
||||||
perror("Send Failed");
|
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)
|
void cOrderWindowCloser(GtkWidget *widget, gpointer data)
|
||||||
|
@ -94,13 +140,18 @@ void cOrderWindowCloser(GtkWidget *widget, gpointer data)
|
||||||
void btConnectClick(GtkWidget *widget, gpointer data)
|
void btConnectClick(GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
g_print("Connection Order\n");
|
g_print("Connection Order\n");
|
||||||
|
|
||||||
//Connection Call
|
//Connection Call
|
||||||
if(!connectToServer())
|
if(!connectToServer())
|
||||||
{
|
{
|
||||||
printf("Threading's Starting\n");
|
printf("Threading's Starting\n");
|
||||||
//Multithread
|
//Multithread
|
||||||
cRecv = 1;
|
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_t cRecvThreadID;
|
||||||
pthread_create(&cRecvThreadID, NULL, cRecvThread, NULL);
|
pthread_create(&cRecvThreadID, NULL, cRecvThread, NULL);
|
||||||
|
|
||||||
|
@ -111,6 +162,11 @@ void btConnectClick(GtkWidget *widget, gpointer data)
|
||||||
cCleaner(clientSocket);
|
cCleaner(clientSocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Time Based Refresh
|
||||||
|
g_timeout_add_seconds(1, cRecvScrollRefresh, NULL);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Chat Window Definition
|
//Chat Window Definition
|
||||||
cOrderWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
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_title(GTK_WINDOW(cOrderWindow), "Tahinli's Client");
|
||||||
gtk_window_set_resizable(GTK_WINDOW(cOrderWindow), FALSE);
|
gtk_window_set_resizable(GTK_WINDOW(cOrderWindow), FALSE);
|
||||||
//TextView
|
//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_widget_set_size_request(GTK_WIDGET(cOrderSendScrollableWindow), 500, 100);
|
||||||
gtk_text_view_set_editable(GTK_TEXT_VIEW(cOrderRecvTextView), FALSE);
|
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
|
//Pane Set
|
||||||
gtk_fixed_put(GTK_FIXED(cOrderPane), cOrderRecvScrollableWindow, 10, 10);
|
gtk_fixed_put(GTK_FIXED(cOrderPane), cOrderRecvScrollableWindow, 10, 10);
|
||||||
|
@ -218,7 +286,6 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
printf("Hello World\n");
|
printf("Hello World\n");
|
||||||
|
|
||||||
|
|
||||||
gtk_init(&argc,&argv);
|
gtk_init(&argc,&argv);
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -269,8 +336,6 @@ int main(int argc, char **argv)
|
||||||
gtk_main();
|
gtk_main();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,7 +397,7 @@ int socketCloser(int aloneSocket)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("Socket is Closed\n");
|
printf("\nSocket is Closed\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,6 +406,7 @@ int cCleaner(int aloneSocket)
|
||||||
{
|
{
|
||||||
cRecv = 0;
|
cRecv = 0;
|
||||||
socketCloser(aloneSocket);
|
socketCloser(aloneSocket);
|
||||||
|
pthread_mutex_destroy(&cMutex);
|
||||||
gtk_widget_show(cWindow);
|
gtk_widget_show(cWindow);
|
||||||
gtk_widget_set_sensitive(GTK_WIDGET(btConnect), TRUE);
|
gtk_widget_set_sensitive(GTK_WIDGET(btConnect), TRUE);
|
||||||
gtk_widget_set_sensitive(GTK_WIDGET(ipEntry), TRUE);
|
gtk_widget_set_sensitive(GTK_WIDGET(ipEntry), TRUE);
|
||||||
|
@ -349,23 +415,73 @@ int cCleaner(int aloneSocket)
|
||||||
}
|
}
|
||||||
int cSendMessageF(int clientSocket, char cMessage[])
|
int cSendMessageF(int clientSocket, char cMessage[])
|
||||||
{
|
{
|
||||||
char cSendBuffer[512];
|
|
||||||
|
|
||||||
if(strlen(cMessage)<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");
|
int isEmpyty = -1;
|
||||||
return -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
|
else
|
||||||
{
|
{
|
||||||
printf("Too Long\n");
|
printf("\nToo Long\n");
|
||||||
return -1;
|
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;
|
||||||
}
|
}
|
3
start
Executable file
3
start
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
gcc main.c -o main `pkg-config --cflags --libs gtk+-3.0` -lpthread
|
||||||
|
./main
|
||||||
|
clear
|
Loading…
Add table
Add a link
Reference in a new issue