LINUX.ORG.RU

Работа с сокетами в C


0

1

Есть клиент на c и сервер на питоне. Клиент оптравляет текст и получает ответ. Но по непонятной причине до сервера доходят только первые 4 символа сообщения.

char* checkPermission(const char* message)
{
	FILE *fp; // Settings file
	char ADDRESS[100]; // Server IP address
	char PORT[100]; // Server port
	char str[300]; // Temporary string
	int port; // Server port, converted to integer
	// Trying to open the settings file
	if((fp = fopen("/etc/g3/server.conf", "r")) == NULL)
	{
		printf("Cannot open server.conf\n");
		exit(4);
	}
	// Getting address and port from the file
	while(!feof(fp))
	{
		char* name;
		char* param;
		fgets(str, 300, fp);
		name = strtok(str, "=");
		param = strtok(NULL, "=");
		if(name != NULL && param != NULL)
		{
			if(!strcmp(name, "HOST"))
				strcpy(ADDRESS, param);
			if(!strcmp(name, "PORT"))
				strcpy(PORT, param);
		}
	}
	fclose(fp);
	ADDRESS[strlen(ADDRESS)-1] = 0;
	PORT[strlen(PORT)-1] = 0;
	port = atoi(PORT);
	char buf[1024];
	int sock; // Socket
	struct sockaddr_in addr;
	// Creating socket
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if(sock < 0)
	{
		printf("Error opening socket\n");
		exit(1);
	}
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr(ADDRESS);
	// Connectiong socket
	if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
	{
		printf("Error connecting to server on ");
		printf("%s:%s\n", ADDRESS, PORT);
		exit(2);
	}
	// Sending information about the command to check
	send(sock, message, sizeof(message), 0);
	// Receiving answer
	recv(sock, buf, sizeof(buf), 0);

	close(sock);
	return buf;
}
★★★★★

Ответ на: комментарий от AptGet
[omich ~]$ vim test.c
[omich ~]$ gcc test.c -o test
[omich ~]$ ./test 
size of b: 4
[omich ~]$ cat test.c
#include <stdio.h>

void test (char *b) {
        printf("size of b: %d\n", sizeof(b));
}

int main (int argc, char **argv) {
        char buf[100500];

        test(buf);

        return;
}

AptGet ★★★ ()
Ответ на: комментарий от vurdalak

> Тогда как правильно указать размер?

char* checkPermission(const char* message, size_t size)
{
    ...
    send(sock, message, size, 0);
}

// K.O.

arsi ★★★★★ ()
Ответ на: комментарий от vurdalak

> А его откуда взять? Ранее он расчитывался sizeof'ом, а теперь?

Если вы задаете такие вопросы, вам точно рано писать программы. В вашем случае, скоерй всего это 1+strlen(message), либо как уже сказали, второй параметр в функции. А как заполнять его, определяется из контекста вызывающей функции.

Nastishka ★★★★★ ()
Ответ на: комментарий от vurdalak

А его откуда взять? Ранее он расчитывался sizeof'ом, а теперь?

[omich ~]$ vim test.c
[omich ~]$ gcc test.c -o test
[omich ~]$ ./test 
sizeof(b): 4, length: 100500
[omich ~]$ cat test.c
#include <stdio.h>

void test(char *b, size_t len) {
        printf("sizeof(b): %d, length: %d\n", sizeof(b), len);
}

int main(int argc, char **argv) {
        char buf[100500];

        test(buf, sizeof(buf));

        return 0;
}

AptGet ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.