Bu yazıda TCP soket oluşturmayı, server-client bağlantısı oluşturup beagleboard a nasıl wifi ile  veri   aktarımı sağlandığını açıklayacağız.

 

 

 

 

*Bu yazıyı okumaya başlamadan, önceki yazımızda göz gezdirilmesi faydalı olacaktır.

Server Tarafı

İster server ister client için kod yazarken kullanacağımız hiçbir fonksiyon standart kütüphanelerde mevcut değildir. Başta projemize aşağıdaki kütüphaneleri eklememiz gerekmektedir.

#include <sys/types.h>
#include <sys/socket.h>

 

Server için program yazdığımıza göre öncelikli tanımlamamız gereken şey port numarasıdır. Server da ip tanımlamasına gerek yoktur makinanın ip sini kullanacaktır. Ip ile port tanımlamalarını client tarafında ,hangi ip ye ve hangi porta bağlanacağını bilmesi gerektiğinden , yapılmalıdır.

#define PORT 5002

 

socket() fonksiyonu bir adet soket oluşturmamızı sağlar. Eğer istenilen parametrelerde bir soket oluşturamazsa hata olarak -1 döndürür. Eğer oluşturabilirse integer tipinde oluşturduğumuz değişkene soketin numarasını atar.

int sock;
 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("Socket");
            exit(1);
        }

İlk parametre soket türünü belirlemektedir. Standart 5 adet soket türü bulunmaktadır

AF_UNIX (UNIX internal protocols)
AF_INET (ARPA Internet protocols)
AF_ISO (ISO protocols)
AF_NS (Xerox Network Systems protocols)
AF_IMPLINK (IMP “host at IMP” link layer)

 

bind() fonksiyonu ile soket ile server   ilişkilendirip yerel adres ataması yapar.

struct sockaddr_in server_addr;
 
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(PORT);
 server_addr.sin_addr.s_addr = INADDR_ANY;
 bzero(&(server_addr.sin_zero),8);
 
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1) {
            perror("Unable to bind");
            exit(1);
  }

listen() fonksiyonu ile artık soket dinleme moduna geçer ve data iletimine izin vermez. peki 5 in anlamı nedir. kısaca sunucu istemciye cevap verirken sırayla gelecek 5 adet isteği kuyruğa koyacak ve bunları sırayla gerçekleştirecek.

if (listen(sock, 5) == -1) {
            perror("Listen");
            exit(1);
        }

 

 accept() fonksiyonu ile sunucuya kabul işlemi uygulanır. Bağlantı farklı bir sokete aktarılır. Çünkü hazırda kullandığımız soketi listen() fonksiyonu ile dinleme moduna geçirmiştik. Data aktarımı için farklı soket kullanılmasının sebebi budur.

sin_size = sizeof(struct sockaddr_in);
 
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
 
printf("\n I got a connection from (%s , %d)\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

 

send() fonksiyonu ile kabul edilen bağlantının soketine göndermek istediğimiz dataları gönderebiliriz. Dikkat etmemiz gereken nokta göndereceğimiz dataların char[] tipinde olmasıdır.

while (1)
            {
              send_data[0]=getchar();
              if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
              {
                send(connected, send_data,strlen(send_data), 0);
                close(connected);
                break;
              }
 
              else
                 send(connected, send_data,strlen(send_data), 0);
            }

 

 

Client Tarafı

Yine  hangi porta bağlanılacağı tanımlanmalıdır

#define PORT 5002

 

Client programında soket bağlantısı için gerekli diğer parametrede ip dir

struct hostent *host;
host = gethostbyname("192.168.1.34");

 

Server kodunda yaptığımız gibi soket oluşturulur. Sonrasında sunucuya bağlantı kurulur.

  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
       perror("Socket");
       exit(1);
    }
 
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(PORT);
        server_addr.sin_addr = *((struct in_addr *)host->h_addr);
        bzero(&(server_addr.sin_zero),8);
 
        if (connect(sock, (struct sockaddr *)&server_addr,
                    sizeof(struct sockaddr)) == -1)
        {
            perror("Connect");
            exit(1);
        }

 

Veri alma kısmında gelen her veri ekrana ordan da seri porta basılarak stellarise gönderilmiş olunur. Bu arada client kodunu beagleboardın çalıştıracağını unutmamak lazım. Seri port kodları metinin sonundaki client in içerisindedir.

veri alma   
  while(1)
        {
 
          bytes_recieved=recv(sock,recv_data,1024,0);
          recv_data[bytes_recieved] = '\0';
 
          if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
          {
           close(sock);
           break;
          }
 
          else
          {
           printf("\ndata = %s " , recv_data);
           Port_Write(&recv_data,strlen(recv_data));
          }
        }

 

Client kodlarını beagleboard üzerinde derlerseniz sunucu ile aynı ağa bağlı olduğunuz sürece network haberleşmesini gerçekleştirebilirsiniz. send() ve recv() fonksiyonlarını server ve client taraflarının ikisinde de kullanabilirsiniz.

Eğer pc nizde derleyip daha sonra beagleboar da çalıştırmak isterseniz linkteki yazılanları uygulamanız gerekmektedir.

 

 

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
 
int main()
 
{
 
        int sock, connected, bytes_recieved , true = 1;
        char send_data [1024] , recv_data[1024];
 
        struct sockaddr_in server_addr,client_addr;
        int sin_size;
 
        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("Socket");
            exit(1);
        }
 
        if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
            perror("Setsockopt");
            exit(1);
        }
 
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(5002);
        server_addr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(server_addr.sin_zero),8);
 
        if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
                                                                       == -1) {
            perror("Unable to bind");
            exit(1);
        }
 
        if (listen(sock, 5) == -1) {
            perror("Listen");
            exit(1);
        }
 
	printf("\nTCPServer Waiting for client on port 5000");
        fflush(stdout);
 
        while(1)
        {
 
            sin_size = sizeof(struct sockaddr_in);
 
            connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
 
            printf("\n I got a connection from (%s , %d)\n",
                   inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
 
            while (1)
            {
             // printf("\n SEND (q or Q to quit) : ");
              send_data[0]=getchar();
 
              if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
              {
                send(connected, send_data,strlen(send_data), 0);
                close(connected);
                break;
              }
 
              else
                 send(connected, send_data,strlen(send_data), 0);
 
              fflush(stdout);
            }
        }
 
      close(sock);
      return 0;
}

 

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
 
int Port_Dosya; /*Portu açmak için dosyamızı tanımlıyoruz */
int tmp_val=0;
 
struct termios ayar;
 
int PortAc(void) /*PortAc adıyla bir prosedur Tanımladık */
{
 
	Port_Dosya  =  open("/dev/ttyUSB0", O_RDWR| O_NOCTTY | O_NDELAY);
 
	if (Port_Dosya == -1) /* Eğer Portumuz açılamadıysa */
	{
		perror ("PortAc: /dev/ttyS0 aygıtı işletilemiyor");
	}
	else
		fcntl(Port_Dosya,F_SETFL,0);
	return (Port_Dosya);
}
 
void Port_Write(char *wrt,int i)
{
	int yaz; /* integer olarak yaz değişkenimizi tanımladık */
 
	yaz=write(Port_Dosya, wrt,i);
 
	if (yaz<0) /* yazın dönüş değeri 0 dan küçükse */
		fputs("Porta Bilgi yazılamıyor\n",stderr);
}
 
int main()
{
	int i=0;
	//int Buffer; /* integer olarak Port_Dosya ve Buffer değişkenimizi tanımladık */
 
    int sock, bytes_recieved;
    char send_data[1024],recv_data[1024];
    struct hostent *host;
    struct sockaddr_in server_addr;
 
    ayar.c_cflag &= ~PARENB;
	ayar.c_cflag &= ~CSTOPB;
	ayar.c_cflag &= ~CSIZE;
	ayar.c_cflag |= CS8;
	ayar.c_cflag &= ~CSIZE; /* karakter uzunluk bit maskesi */
	ayar.c_cflag |= CS8; /* sekiz karakteri paketle */
	ayar.c_cflag |= (CLOCAL | CREAD);
	Port_Dosya = PortAc();
	tcgetattr(Port_Dosya, &ayar);
	cfsetispeed(&ayar, B9600);
	cfsetospeed(&ayar, B9600);
 
	tcsetattr(Port_Dosya, TCSANOW, &ayar);
 
    host = gethostbyname("192.168.1.34");
 
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
       perror("Socket");
       exit(1);
    }
 
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(5002);
        server_addr.sin_addr = *((struct in_addr *)host->h_addr);
        bzero(&(server_addr.sin_zero),8);
 
        if (connect(sock, (struct sockaddr *)&server_addr,
                    sizeof(struct sockaddr)) == -1)
        {
            perror("Connect");
            exit(1);
        }
 
        while(1)
        {
 
          bytes_recieved=recv(sock,recv_data,1024,0);
          recv_data[bytes_recieved] = '\0';
 
          if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
          {
           close(sock);
           break;
          }
 
          else
          {
           printf("\ndata = %s " , recv_data);
           Port_Write(&recv_data,strlen(recv_data));
          }
        }
return 0;
}