Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Не получается решить задачу на C

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Не получается решить задачу на C
Имя
Сообщение << Старые топики   Новые топики >>
Не получается решить задачу на C - 2009-12-17 20:32:09.610000   
proliger

Сообщений: 1
Оценки: 0
Присоединился: 2009-12-17 20:05:51.153333
Задача : Нужно чтобы к одному серверу подключалось 2 клиента(как сделать так чтобы к серверу подключался 1 клиент я разобрался) и Обменялись сообщениями
Имеется : Уже готовый клиент , сервер (только для 1 клиента) , и потоки(как образец)
Исходные коды :
Сервер
// serv.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include &lt;sys/types.h&gt; #include &lt;winsock2.h&gt; #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"netapi32.lib") int main(int argc, char* argv[]) { struct sockaddr_in local; SOCKET s , s1; int rc; const int ar = 10; const int arr = 12; char buf[arr]; char bub [ar]={ 'm','a','m','a',' ','p','a','p','a'}; WSADATA wsaData; int wsaret = WSAStartup(0x101,&wsaData); if(wsaret != 0) { return 0; } local.sin_family = AF_INET; local.sin_port = htons(7500); local.sin_addr.s_addr = htonl(INADDR_ANY); s = socket (AF_INET, SOCK_STREAM,0); if (s &lt; 0) { perror("fail socket"); return 1; } struct sockaddr *ss = ( sockaddr *)&local; int size_str = sizeof (local); rc = bind(s,ss,size_str); if(rc &lt; 0) { perror("fail bind"); } rc = listen (s,5); if(rc &lt; 0) { perror("fail listen"); } s1 = accept(s,NULL,NULL); if(s1 &lt; 0) { perror("fail accept"); } if (s1 &gt; 0) { perror("s1 accept"); } ////////////////////////////////////////// rc = recv(s1,buf,14,0); if(rc &lt;= 0) { perror("fail recv") ; } else { cout &lt;&lt; "Send from client " ; cout &lt;&lt; buf &lt;&lt; endl; } rc = send(s1,bub,10,0); if(rc &lt;= 0) { perror("fail send"); return 1; } else {cout &lt;&lt; "Send to client " ; cout &lt;&lt; bub &lt;&lt; endl; } return 0; }
Клиент
Я думаю выкладывать не стоит , там все нормально.

Потоки
Если нужно то выложу.

Решение проблемы :
Проблему нужно решить приблизительно вот в этой области
if (s1 &gt; 0) { perror("s1 accept"); } Через функцию CreateThread();
Вопрос как это можно осуществить ?
Post #: 1
RE: Не получается решить задачу на C - 2009-12-17 20:51:09.096666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты синхронные или асинхронные сокеты хочешь?

Если синхронные с многопоточностью, то: на сервере делаешь поток, который в цикле "listen" и при подключении создаёт по потоку для каждого клиента. А уже в "клиентских" потоках делаешь обмен информацией.

Т.е. listen должен вызываться для каждого клиента.

Поищи в MSDN-е. Там более-менее хорошие гайды на эту тему. http://msdn.microsoft.com/en-us/library/ms740632(VS.85).aspx
Post #: 2
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Не получается решить задачу на C







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.