quite enough, i know it could be better
This commit is contained in:
parent
2cd054c990
commit
3e52af9bdc
1 changed files with 225 additions and 41 deletions
260
main.c
260
main.c
|
@ -1,25 +1,42 @@
|
||||||
#include <stdio.h>
|
//Libraries
|
||||||
#include <stdlib.h>
|
#include <stdio.h>
|
||||||
#include <gtk/gtk.h>
|
#include <stdlib.h>
|
||||||
#include <sys/socket.h>
|
#include <gtk/gtk.h>
|
||||||
#include <sys/types.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/ip.h>
|
#include <netdb.h>
|
||||||
#include <netinet/in.h>
|
#include <sys/types.h>
|
||||||
#include <arpa/inet.h>
|
#include <netinet/ip.h>
|
||||||
#include <string.h>
|
#include <netinet/in.h>
|
||||||
#include <unistd.h>
|
#include <arpa/inet.h>
|
||||||
#include <errno.h>
|
#include <string.h>
|
||||||
#include <pthread.h>
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
//Global Variables
|
//Global Variables
|
||||||
int cSendLength;
|
//Client
|
||||||
int cRecvLength;
|
int cSendLength;
|
||||||
int cRecv;
|
int cRecvLength;
|
||||||
int cRecvCommunicate;
|
int cRecv;
|
||||||
char recvBuffer[512];
|
int cRecvCommunicate;
|
||||||
int cSendCheck = -1;
|
char recvBuffer[512];
|
||||||
|
int cSendCheck = -1;
|
||||||
|
//Server
|
||||||
|
struct sockaddr_in serverAddr;
|
||||||
|
struct sockaddr_in clientAddr;
|
||||||
|
int sClientSocket;
|
||||||
|
int sRecv;
|
||||||
|
int maxClient = 10;
|
||||||
|
int socketLen;
|
||||||
|
int messageLoop = 1;
|
||||||
|
int epoll_fd;
|
||||||
|
|
||||||
|
|
||||||
//Thread Values
|
//Thread Values
|
||||||
pthread_mutex_t cMutex;
|
pthread_mutex_t cMutex;
|
||||||
|
pthread_mutex_t sMutex;
|
||||||
|
|
||||||
|
|
||||||
//Server Window Decleration
|
//Server Window Decleration
|
||||||
|
@ -46,23 +63,25 @@ pthread_mutex_t cMutex;
|
||||||
//Socket Decleration
|
//Socket Decleration
|
||||||
int clientSocket;
|
int clientSocket;
|
||||||
int serverSocket;
|
int serverSocket;
|
||||||
|
|
||||||
//Funcs
|
//Funcs
|
||||||
int connectToServer(void);
|
int connectToServer(void);
|
||||||
int socketCloser(int aloneSocket);
|
int socketCloser(int aloneSocket);
|
||||||
int cCleaner(int aloneSocket);
|
int cCleaner(int aloneSocket);
|
||||||
int cSendMessageF(int clientSocket, char cMessage[]);
|
int sCleaner(void);
|
||||||
int startServer(void);
|
int cSendMessageF(int clientSocket, char cMessage[]);
|
||||||
|
int startServer(void);
|
||||||
|
int setnonblocking(int sockfd);
|
||||||
|
|
||||||
//Threads
|
//Threads
|
||||||
|
|
||||||
void *cRecvThread (void *vargp)
|
void *cRecvThread (void *vargp)
|
||||||
{//93.190.8.248
|
{
|
||||||
|
|
||||||
printf("cRecvThread\n");
|
printf("cRecvThread\n");
|
||||||
GtkTextIter cRIter;
|
GtkTextIter cRIter;
|
||||||
GtkTextMark *cRMark;
|
GtkTextMark *cRMark;
|
||||||
GtkAdjustment *cRHeight;
|
GtkAdjustment *cRHeight;
|
||||||
|
char cLine = '\n';
|
||||||
while(cRecv)
|
while(cRecv)
|
||||||
{
|
{
|
||||||
memset(recvBuffer, ' ', 511);
|
memset(recvBuffer, ' ', 511);
|
||||||
|
@ -77,6 +96,7 @@ void *cRecvThread (void *vargp)
|
||||||
cRMark = gtk_text_buffer_get_insert(cOMessageRecvBuffer);
|
cRMark = gtk_text_buffer_get_insert(cOMessageRecvBuffer);
|
||||||
gtk_text_buffer_get_iter_at_mark(cOMessageRecvBuffer, &cRIter, cRMark);
|
gtk_text_buffer_get_iter_at_mark(cOMessageRecvBuffer, &cRIter, cRMark);
|
||||||
gtk_text_buffer_insert(cOMessageRecvBuffer, &cRIter, recvBuffer, -1);
|
gtk_text_buffer_insert(cOMessageRecvBuffer, &cRIter, recvBuffer, -1);
|
||||||
|
//gtk_text_buffer_insert(cOMessageRecvBuffer, &cRIter, &cLine, 1);
|
||||||
//gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(cOrderRecvTextView), cRMark, 0., FALSE, 0., 0.);
|
//gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(cOrderRecvTextView), cRMark, 0., FALSE, 0., 0.);
|
||||||
//Thread Unlock.
|
//Thread Unlock.
|
||||||
pthread_mutex_unlock(&cMutex);
|
pthread_mutex_unlock(&cMutex);
|
||||||
|
@ -88,6 +108,116 @@ void *cRecvThread (void *vargp)
|
||||||
pthread_exit(cRecvThread);
|
pthread_exit(cRecvThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *sRecvThread (void *vargp)
|
||||||
|
{
|
||||||
|
printf("\nsRecvThread\n");
|
||||||
|
|
||||||
|
char sMessage[513];
|
||||||
|
int sMessageCount = 0;
|
||||||
|
int sClientCount = 0;
|
||||||
|
char sClientAddr[NI_MAXHOST];
|
||||||
|
char sClientServ[NI_MAXSERV];
|
||||||
|
|
||||||
|
|
||||||
|
epoll_fd = epoll_create1(0);
|
||||||
|
if(0>epoll_fd)
|
||||||
|
{
|
||||||
|
perror("Epoll Creation\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct epoll_event ev[maxClient+1];
|
||||||
|
ev[0].events = EPOLLIN | EPOLLOUT | EPOLLET;
|
||||||
|
ev[0].data.fd = serverSocket;
|
||||||
|
sClientCount++;
|
||||||
|
|
||||||
|
if(0>epoll_ctl(epoll_fd, EPOLL_CTL_ADD, serverSocket, &ev[0]))
|
||||||
|
{
|
||||||
|
perror("Epoll_CTL\n");
|
||||||
|
}
|
||||||
|
int nfds = 0;
|
||||||
|
|
||||||
|
while(sRecv)
|
||||||
|
{
|
||||||
|
nfds = epoll_wait(epoll_fd, ev, maxClient, 0);
|
||||||
|
for(int i = 0;i<nfds;i++)
|
||||||
|
{
|
||||||
|
if(ev[i].data.fd == serverSocket)
|
||||||
|
{
|
||||||
|
sClientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &socketLen);
|
||||||
|
if(0>getnameinfo((struct sockaddr*)&clientAddr, socketLen, sClientAddr, sizeof(sClientAddr), sClientServ, sizeof(sClientServ), NI_NUMERICHOST | NI_NUMERICSERV))
|
||||||
|
{
|
||||||
|
perror("Getnameinfo\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Client Info = %s:%s\n", sClientAddr, sClientServ);
|
||||||
|
sClientCount++;
|
||||||
|
}
|
||||||
|
setnonblocking(sClientSocket);
|
||||||
|
ev[sClientCount].events = EPOLLIN | EPOLLET | EPOLLRDHUP | EPOLLHUP;
|
||||||
|
ev[sClientCount].data.fd = sClientSocket;
|
||||||
|
if(0>epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sClientSocket, &ev[sClientCount]))
|
||||||
|
{
|
||||||
|
perror("EPOLL_CTL-Client\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("New Client Added\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ev[i].events && EPOLLIN)
|
||||||
|
{
|
||||||
|
int sCompletedMessage = 1;
|
||||||
|
while(sCompletedMessage)
|
||||||
|
{
|
||||||
|
bzero(sMessage, sizeof(sMessage));
|
||||||
|
sMessageCount = read(ev[i].data.fd, sMessage, sizeof(sMessage)-1);
|
||||||
|
sMessage[513] = '\0';
|
||||||
|
if(0>sMessageCount)
|
||||||
|
{
|
||||||
|
//perror("MessageCount\n");
|
||||||
|
/*printf("Closing Connection Requested\n");
|
||||||
|
epoll_ctl(epoll_fd, EPOLL_CTL_DEL, ev[i].data.fd, NULL);
|
||||||
|
close(ev[i].data.fd);
|
||||||
|
sClientCount--;
|
||||||
|
continue;*/
|
||||||
|
}
|
||||||
|
else if(0==sMessageCount)
|
||||||
|
{
|
||||||
|
sCompletedMessage = 0;
|
||||||
|
printf("0 Closing Connection Requested\n");
|
||||||
|
epoll_ctl(epoll_fd, EPOLL_CTL_DEL, ev[i].data.fd, NULL);
|
||||||
|
close(ev[i].data.fd);
|
||||||
|
sClientCount--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Message = %s\n", sMessage);
|
||||||
|
for(int j = 0;j<=sClientCount;j++)
|
||||||
|
{
|
||||||
|
write(ev[j].data.fd, sMessage, sizeof(sMessage));
|
||||||
|
}
|
||||||
|
sCompletedMessage = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Bir Şey Oldu\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(0>close(epoll_fd))
|
||||||
|
{
|
||||||
|
perror("Epoll Close\n");
|
||||||
|
}
|
||||||
|
printf("\nsRecv is Closing\n");
|
||||||
|
}
|
||||||
|
|
||||||
//Time Based Events
|
//Time Based Events
|
||||||
|
|
||||||
gboolean cRecvScrollRefresh(gpointer data)
|
gboolean cRecvScrollRefresh(gpointer data)
|
||||||
|
@ -119,11 +249,28 @@ gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data);
|
||||||
|
|
||||||
|
|
||||||
//Button Events
|
//Button Events
|
||||||
|
void sWindowCloser(GtkWidget *widget, gpointer data)
|
||||||
|
{
|
||||||
|
printf("\nClosing Server\n");
|
||||||
|
gtk_widget_destroy(GTK_WIDGET(sWindow));
|
||||||
|
sCleaner();
|
||||||
|
}
|
||||||
|
|
||||||
void btStartClick(GtkWidget *widget, gpointer data)
|
void btStartClick(GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
g_print("\nServer Start Order\n");
|
g_print("\nServer Start Order\n");
|
||||||
if(startServer())
|
|
||||||
|
if(!startServer())
|
||||||
|
{
|
||||||
|
printf("Threading's Starting\n");
|
||||||
|
//Multithread
|
||||||
|
sRecv = 1;
|
||||||
|
pthread_mutex_init(&sMutex, NULL);
|
||||||
|
pthread_t sRecvThreadID;
|
||||||
|
pthread_create(&sRecvThreadID, NULL, sRecvThread, NULL);
|
||||||
|
gtk_widget_set_sensitive(GTK_WIDGET(btStart), FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
perror("Server couldn't start");
|
perror("Server couldn't start");
|
||||||
}
|
}
|
||||||
|
@ -161,14 +308,9 @@ void btConnectClick(GtkWidget *widget, gpointer data)
|
||||||
//Connection Call
|
//Connection Call
|
||||||
if(!connectToServer())
|
if(!connectToServer())
|
||||||
{
|
{
|
||||||
printf("Threading's Starting\n");
|
printf("Client Side 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_mutex_init(&cMutex, NULL);
|
||||||
pthread_t cRecvThreadID;
|
pthread_t cRecvThreadID;
|
||||||
pthread_create(&cRecvThreadID, NULL, cRecvThread, NULL);
|
pthread_create(&cRecvThreadID, NULL, cRecvThread, NULL);
|
||||||
|
@ -317,6 +459,10 @@ void btServerClick(GtkWidget *widget, gpointer data)
|
||||||
//Epilogue
|
//Epilogue
|
||||||
gtk_container_add(GTK_CONTAINER(sWindow), sPane);
|
gtk_container_add(GTK_CONTAINER(sWindow), sPane);
|
||||||
gtk_widget_show_all(sWindow);
|
gtk_widget_show_all(sWindow);
|
||||||
|
|
||||||
|
//CloseEvent
|
||||||
|
g_signal_connect(G_OBJECT(sWindow), "destroy",G_CALLBACK(sWindowCloser), NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -398,8 +544,6 @@ int connectToServer(void)
|
||||||
}
|
}
|
||||||
ipAddress[strlen(ipAddress)+1]='\0';
|
ipAddress[strlen(ipAddress)+1]='\0';
|
||||||
portNumber[strlen(portNumber)+1]='\0';
|
portNumber[strlen(portNumber)+1]='\0';
|
||||||
|
|
||||||
//Connection Information //93.190.8.248
|
|
||||||
struct sockaddr_in server_Socket;
|
struct sockaddr_in server_Socket;
|
||||||
server_Socket.sin_family = AF_INET;
|
server_Socket.sin_family = AF_INET;
|
||||||
server_Socket.sin_addr.s_addr = inet_aton(ipAddress, (struct in_addr*)&server_Socket.sin_addr.s_addr);
|
server_Socket.sin_addr.s_addr = inet_aton(ipAddress, (struct in_addr*)&server_Socket.sin_addr.s_addr);
|
||||||
|
@ -452,6 +596,13 @@ int cCleaner(int aloneSocket)
|
||||||
gtk_widget_set_sensitive(GTK_WIDGET(portEntry), TRUE);
|
gtk_widget_set_sensitive(GTK_WIDGET(portEntry), TRUE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int sCleaner(void)
|
||||||
|
{
|
||||||
|
sRecv = 0;
|
||||||
|
socketCloser(serverSocket);
|
||||||
|
socketCloser(sClientSocket);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int cSendMessageF(int clientSocket, char cMessage[])
|
int cSendMessageF(int clientSocket, char cMessage[])
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -513,10 +664,12 @@ int startServer(void)
|
||||||
char sPortNumber[] = "00000";
|
char sPortNumber[] = "00000";
|
||||||
strncpy(sPortNumber, gtk_entry_get_text(GTK_ENTRY(sPortEntry)),5);
|
strncpy(sPortNumber, gtk_entry_get_text(GTK_ENTRY(sPortEntry)),5);
|
||||||
sPortNumber[5] = '\n';
|
sPortNumber[5] = '\n';
|
||||||
/*for(int i = 0; i<strlen(sPortNumber);i++)
|
printf("Port is = %s\n", sPortNumber);
|
||||||
{
|
socketLen = sizeof(clientAddr);
|
||||||
printf("%c---%d\n", sPortNumber[i], sPortNumber[i]);
|
|
||||||
}*/
|
bzero((char *)&serverAddr, sizeof(serverAddr));
|
||||||
|
bzero((char *)&clientAddr, sizeof(clientAddr));
|
||||||
|
|
||||||
|
|
||||||
//Socket Setup
|
//Socket Setup
|
||||||
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||||
|
@ -530,6 +683,36 @@ int startServer(void)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
serverAddr.sin_family = AF_INET;
|
||||||
|
serverAddr.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
serverAddr.sin_port = htons(atoi(sPortNumber));
|
||||||
|
socklen_t serverAddr_len = sizeof(serverAddr);
|
||||||
|
if(0>bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr_in)))
|
||||||
|
{
|
||||||
|
printf("ERRNO = %d:%s\n", errno, strerror(errno));
|
||||||
|
perror("Bind Failed");
|
||||||
|
socketCloser(serverSocket);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
setnonblocking(serverSocket);
|
||||||
|
if(0>listen(serverSocket, 0))
|
||||||
|
{
|
||||||
|
printf("ERRNO = %d:%s\n", errno, strerror(errno));
|
||||||
|
perror("Listen Failed");
|
||||||
|
socketCloser(serverSocket);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int setnonblocking(int sockfd)
|
||||||
|
{
|
||||||
|
if(0>fcntl(sockfd, F_SETFD, fcntl(sockfd, F_GETFD, 0) | O_NONBLOCK))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,3 +732,4 @@ gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue