Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Öne çıkan mesajlar

Mesaj tarihi:
selamlar,

socket kullanarak 1 server ve 3 client arasinda zar oyunu oynatmam lazim. program buyuk cogunluguyla bitti ancak serverdan alinan stringlerin bir parcasini daha sonradan kullanmak icin alirken ya baska bir nedenden dolayi bazen hatalar cikiyor.

server "0> THRW 0 2 4 sigismond" diye her clienta mesaj yolluyor. ben de asagidaki fonksiyonlarla bu stringteki son kelimeyi aliyorum bot ismi olarak.

getBotName()


static void append(char* s, char c)
{
int len = strlen(s);
s[len] = c;
s[len+1] = '';
}

static char *getBotName(char *input)
{
int i = strlen(input)-1;
int j;
char *output;
output = (char *)malloc(strlen(input)+1);
while (input[i] != ' ') { i--; }
for (j=i+1; j<strlen(input); j++)
{
append(output, input[j]);
}
return output;
}




hatta sonra emin olmak icin baska bir tane daha yazdim belki yanlistir diye:

myFunc()


static char *myFunc(char *input)
{
int i;
int j = 0;
char *output = malloc(strlen(input)-13);
int len = strlen(input);
for (i=14; i<len; i++)
{
output[j++] = input[i];
}
output[len+1] = '';
return output;
}


not: isme kadar her seferinde fix olarak 13 karakter olacak. o yuzden 14ten baslattim.



serverdan gonderilen mesaji clientta char msgRe[MAX_LENGTH] icinde aliyorum. daha sonra getBotName(msgRe) ya da diger fonksiyonla basta bot isimlerini ayri ayri kaydedip sonrasinda strcmp ile isimleri gelen mesajla kiyaslayarak ne yapilmasi gerektigine karar veriyorum. ama getBotName() fonksiyonu cogu zaman dogru stringi verse de bazen asagidaki ssdeki gibi garip karakterler de ekliyor:

http://oi52.tinypic.com/65zcz4.jpg

sorun nerede olabilir? nasil duzeltebilirim?
Mesaj tarihi:
strtok ile almayi denesene son kelimeyi. bir de ne hatasi aliosun? seg fault aliosan muhtemelen malloclarin argumanlarini yanlis veriosun.

strtok ile ayir stringi, ordan cek son kelimeyi. profit.
Mesaj tarihi:
hata almiyorum yanlis hesapliyor sadece. cunku stringleri karsilastirirken farkli birsey gorunce yapilmasi gerekeni yapimiyor. clientin kendi puanini ve diger botlarin puanlarini toplamasi lazim. benim fonksiyonlar niye her zaman gorevini yapmiyor onu anlamadim. strtok ile deniyim bir.
Mesaj tarihi:
Her taraf bellek ihlali dolu ya. strlen(...)'den gelen değerdeki indekse zaten erişemezsin, sen üstüne 1 karakter daha eklemeye çalışmışsın. STL string'i kullanmamak için özel bi sebebin varsa, biraz zahmetli de olsa şöyle yap append fonksiyonunu:


char* append(char* input, char c)
{
char* output = (char*)calloc(strlen(input) + 1, sizeof(char));
sprintf(output, "%s%c", input, c);
return output;
}


Ayrıca bütün bu aldığın bellekleri free'liyosundur diye umuyorum.
Mesaj tarihi:
niye her seferinde ismi yolluyorsun string olarak? bir struct kursan enum olarak komutları tutsa, string/int olarak da yollayacaklarını daha iyi olmaz mı?

ayrıca, bağlantı yaparken CONNECT diye komut yollarsın, string olarak da botName. server da yollanan ip ile botName'yi eşleştirir, her seferinde botName yollamana gerek kalmaz.
Mesaj tarihi:
strtok ile cozdum sorunu tesekkurler. flush yapiyordum. bir de benim sadece client programlamam lazim. serverdan her sekilde string olarak alicam. o yuzden parcalamam gerekiyordu. tesekkurler tekrardan.
Mesaj tarihi:
benim bu send recvle çok problemim olacak. farklı veri türlerine sahip structu yollayamıyorum resmen. char char gönderip aynı şekilde alamıyorum. başlığı açan kişi doğru düzgün veri gönderebiliyosa bi bana ulaşsın nedir nasıl yapıyor.
Mesaj tarihi:
getBotName() fonksiyonundaki su satir hatali,

while (input != ' ') { i--; }

myFunc() fonksiyonundaki su satir hatali gozukuyor,

output[j++] = input;

Burda heralde deref etmek istedin her birini.

Ayrica,
eger parametre olarak gelen 'char *input' null olursa crash olur, o yuzden onun null olmasina karsi assertion yada null check yapmalisin.

13, 14 gibi rakamlar
#define' halinde daha acik isimlerle tanimlanabilir.

malloc,calloc bunlari geri donus degerlerini kontrol etmeyi aliskanlik etsen iyi olur. Linux'de null donmuyor ama ileride kullandigin platformlarda olabilir.

for loop'da kopyalama yaptigin blocklari memcpy ile yaparsan daha iyi olur, mesela;

getBotName() dekini su sekilde yazabilirsin;
memcpy(output, &input[i+1], strlen(input);

myFunc() dakide su sekilde;
memcpy(&output[0], input, len - 14);
×
×
  • Yeni Oluştur...