Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 21:26   #1
Valerya 22
Пользователь
 
Аватар для Valerya 22
 
Регистрация: 26.01.2011
Сообщений: 13
Вопрос проблема с TCP чатом

Помогите разобраться, пожалуйста, никак не получается связать сокет через accept (программа дальше просто не идет). Не пойму почему и что надо сделать
Код:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
 
TCP-сервер

int __cdecl main(void) 
{
	WSADATA wsaData;
	SOCKET ListenSocket,ClientSocket;  // впускающий сокет и сокет для клиентов
	sockaddr_in ServerAddr;  // это будет адрес сервера
	int err, maxlen = 512;  // код ошибки и размер буферов
	char* recvbuf=new char[maxlen];  // буфер приема
	char* result_string=new char[maxlen];  // буфер отправки
 
 
	// Initialize Winsock
	WSAStartup(MAKEWORD(2,2), &wsaData);
 
	// Create a SOCKET for connecting to server
	ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
	// Setup the TCP listening socket
	ServerAddr.sin_family=AF_INET;
	ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
	ServerAddr.sin_port=htons(12345);
	err = bind( ListenSocket, (sockaddr *) &ServerAddr, sizeof(ServerAddr));
	if (err == SOCKET_ERROR) {
		printf("bind failed: %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}
 
	err = listen(ListenSocket, 50);
	if (err == SOCKET_ERROR) {
		printf("listen failed: %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}
	while (true) {
		// Accept a client socket
		ClientSocket = accept(ListenSocket, NULL, NULL);
		err = recv(ClientSocket, recvbuf, maxlen, 0);
		if (err > 0) {
			recvbuf[err]=0;
			printf("Received query: %s\n", (char* )recvbuf);
			// вычисляем результат
			int result=72;
			_snprintf_s(result_string,maxlen,maxlen,"OK %d\n",result);
			// отправляем результат на сервер
			send( ClientSocket,  result_string, strlen(result_string), 0 );
			printf("Sent answer: %s\n", result_string);
		}
		else if (err == 0)
			printf("Connection closing...\n");
		else  {
			printf("recv failed: %d\n", WSAGetLastError());
			closesocket(ClientSocket);
			WSACleanup();
			return 1;
		}
 
		// shutdown the connection since we're done
		closesocket(ClientSocket);
	}
}

TCP-клиент
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
 
int __cdecl main(void) 
{
	WSADATA wsaData;
	SOCKET ConnectSocket;  // впускающий сокет и сокет для клиентов
	sockaddr_in ServerAddr;  // это будет адрес сервера
	int err, maxlen = 512;  // код ошибки и размер буферов
	char* recvbuf=new char[maxlen];  // буфер приема
	char* query=new char[maxlen];  // буфер отправки
 
 
	// Initialize Winsock
	WSAStartup(MAKEWORD(2,2), &wsaData);
 
	// Connect to server
	ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
	ServerAddr.sin_family=AF_INET;
	ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
	ServerAddr.sin_port=htons(12345);
 
	err = connect( ConnectSocket, (sockaddr *) &ServerAddr, sizeof(ServerAddr));
 
	if (err == SOCKET_ERROR) {
		printf("connect failed: %d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}
 
	_snprintf_s(query,maxlen,maxlen,"CALC * 12 6\n");
	// отправляем запрос на сервер
	send( ConnectSocket,  query, strlen(query), 0 );
	printf("Sent: %s\n", query);
 
	// получаем результат
	err = recv(ConnectSocket, recvbuf, maxlen, 0);
	if (err > 0) {
		recvbuf[err]=0;
		printf("Result: %s\n", (char* )recvbuf);
	}
	else if (err == 0)
		printf("Connection closing...\n");
	else  {
		printf("recv failed: %d\n", WSAGetLastError());
		closesocket(ConnectSocket);
		WSACleanup();
		return 1;
	}
 
	// shutdown the connection since we're done
	closesocket(ConnectSocket);
 
}

Последний раз редактировалось Valerya 22; 05.05.2012 в 21:42.
Valerya 22 вне форума Ответить с цитированием
Старый 06.05.2012, 22:21   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Нужно прилинковать библиотеку для работы с сокетами ws2_32.lib. В VS это делается так:
Код:
#pragma comment(lib,"ws2_32.lib")
counter вне форума Ответить с цитированием
Старый 06.05.2012, 22:42   #3
Valerya 22
Пользователь
 
Аватар для Valerya 22
 
Регистрация: 26.01.2011
Сообщений: 13
По умолчанию

counter, с библиотекой всё равно не работает... я уже не знаю, что делать. в чем еще может быть проблема?

Последний раз редактировалось Valerya 22; 06.05.2012 в 22:55.
Valerya 22 вне форума Ответить с цитированием
Старый 07.05.2012, 01:08   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

что значит не работает?
counter вне форума Ответить с цитированием
Старый 07.05.2012, 21:46   #5
Valerya 22
Пользователь
 
Аватар для Valerya 22
 
Регистрация: 26.01.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
что значит не работает?
программа дальше просто не идет, у меня в коде другая библиотека
Код:
#pragma comment(lib, "wsock32.lib")
Valerya 22 вне форума Ответить с цитированием
Старый 07.05.2012, 23:48   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

код рабочий!



попробуй запустить сначала сервер, а потом клиент
counter вне форума Ответить с цитированием
Старый 09.05.2012, 13:32   #7
Valerya 22
Пользователь
 
Аватар для Valerya 22
 
Регистрация: 26.01.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
код рабочий!



попробуй запустить сначала сервер, а потом клиент
counter, если Вы пишете, что код работает, наверно, вы это проверяли
не могли бы Вы выложить файл с проектом, пожалуйста, если такой имеется, конечно
P.S. ваша картинка не отображается
Valerya 22 вне форума Ответить с цитированием
Старый 09.05.2012, 22:53   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

----------------------------------
Вложения
Тип файла: rar tcp.rar (2.68 Мб, 20 просмотров)
counter вне форума Ответить с цитированием
Старый 10.05.2012, 21:07   #9
Valerya 22
Пользователь
 
Аватар для Valerya 22
 
Регистрация: 26.01.2011
Сообщений: 13
По умолчанию

counter, спасибо большое!
Valerya 22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с чатом (серверная часть) vaan.sk C/C++ Сетевое программирование 2 24.05.2011 20:58
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05
проблема с чатом cheef Работа с сетью в Delphi 5 13.07.2009 16:37