404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
1

Сокеты

04.08.2011, 15:55. Показов 8559. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал простой TCP клинет
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
    WORD v=MAKEWORD(2,0);
    WSADATA d;
    int e=WSAStartup(v,&d);
    if (e)
    {
        perror("error initializing winsock");
        return 1;
    }
    struct sockaddr_in peer;
    int s;
    int rc;
    char buf[1];
    peer.sin_family=AF_INET;
    peer.sin_port=htons(7500);
    peer.sin_addr.s_addr=inet_addr("127.0.0.1");
    s=socket(AF_INET,SOCK_STREAM,0);
    if (s<0)
    {
        perror("error calling socket");
        return 1;
    }
    rc=connect(s,(struct sockaddr *)&peer,sizeof(peer));
    if (rc)
    {
        perror("error calling connect");
        return 1;
    }
    rc=send(s,"1",1,0);
    if (rc<=0)
    {
        perror("error calling send");
        return 1;
    }
    rc=recv(s,buf,1,0);
    if (recv<=0)
        perror("error calling recv");
    else
        printf("%c\n",buf[0]);
    return 0;
}
и TCP сервер
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
    WORD v=MAKEWORD(2,0);
    WSADATA d;
    int e=WSAStartup(v,&d);
    if (e)
    {
        perror("error initializing winsock");
        return 1;
    }
    struct sockaddr_in local;
    int s;
    int s1;
    int rc;
    char buf[1];
    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<0)
    {
        perror("error calling socket");
        return 1;
    }
    rc=bind(s,(struct sockaddr *)&local,sizeof(local));
    if (rc<0)
    {
        perror("error calling bind");
        return 1;
    }
    rc=listen(s,5);
    if (rc)
    {
        perror("error calling listen");
        return 1;
    }
    s1=accept(s,NULL,NULL);
    if (s1<0)
    {
        perror("error calling accept");
        return 1;
    }
    rc=recv(s1,buf,1,0);
    if (rc<=0)
    {
        perror("error calling recv");
        return 1;
    }
    printf("%c\n",buf[0]);
    rc=send(s1,"2",1,0);
    if (rc<=0)
        perror("error calling send");
    return 0;
}
в первый раз когда запустил было все нормально клиент выводил 2 а сервер 1. Но во второй раз сервер вывел 1 а клиент нечего. Как это можно исправить?

Добавлено через 1 час 18 минут
Исправил, оказывается забыл закрыть сокеты. Если кому надо вот исправленные клиент и сервер.
клинет
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
    WORD v=MAKEWORD(2,0);
    WSADATA d;
    int e=WSAStartup(v,&d);
    if (e)
    {
        perror("error initializing winsock");
        return 1;
    }
    struct sockaddr_in peer;
    int s;
    int rc;
    char buf[1];
    peer.sin_family=AF_INET;
    peer.sin_port=htons(7500);
    peer.sin_addr.s_addr=inet_addr("127.0.0.1");
    s=socket(AF_INET,SOCK_STREAM,0);
    if (s<0)
    {
        perror("error calling socket");
        return 1;
    }
    rc=connect(s,(struct sockaddr *)&peer,sizeof(peer));
    if (rc)
    {
        perror("error calling connect");
        return 1;
    }
    rc=send(s,"1",1,0);
    if (rc<=0)
    {
        perror("error calling send");
        return 1;
    }
    rc=recv(s,buf,1,0);
    if (recv<=0)
        perror("error calling recv");
    else
        printf("%c\n",buf[0]);
    if (closesocket(s))
        perror("error calling closesocket");
    WSACleanup();
    return 0;
}
сервер
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
    WORD v=MAKEWORD(2,0);
    WSADATA d;
    int e=WSAStartup(v,&d);
    if (e)
    {
        perror("error initializing winsock");
        return 1;
    }
    struct sockaddr_in local;
    int s;
    int s1;
    int rc;
    char buf[1];
    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<0)
    {
        perror("error calling socket");
        return 1;
    }
    rc=bind(s,(struct sockaddr *)&local,sizeof(local));
    if (rc<0)
    {
        perror("error calling bind");
        return 1;
    }
    rc=listen(s,5);
    if (rc)
    {
        perror("error calling listen");
        return 1;
    }
    s1=accept(s,NULL,NULL);
    if (s1<0)
    {
        perror("error calling accept");
        return 1;
    }
    rc=recv(s1,buf,1,0);
    if (rc<=0)
    {
        perror("error calling recv");
        return 1;
    }
    printf("%c\n",buf[0]);
    rc=send(s1,"2",1,0);
    if (rc<=0)
        perror("error calling send");
    if (closesocket(s))
        perror("error calling closesocket");
    if (closesocket(s1))
        perror("error calling closesocket");
    WSACleanup();
    return 0;
}
8
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2011, 15:55
Ответы с готовыми решениями:

Сокеты в VC++ 2008
Привет всем. Я делаю клиент и сервер. Делаю по книге : Снейдер Й. - Эффективное программирование...

Кейлогер и сокеты
Здравствуйте, дорогие форумчане! Вопрос у меня образовался. Код данный кейлогером мной написанным...

хоть убейте а опять сокеты
ришу прогу раз десятый (раньше всё работало но вот раслабил мозг на пару дней) тут при подключении...

Ищу учебник по Си и Сокетам в Си, в обычном учебнике по Си будет раздел "сокеты"?
Ищу учебник по Си и с Сокетам в Си, в обычном учебнике по Си будет раздел &quot;сокеты&quot;? Т.е. искать...

5
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
07.10.2011, 05:57 2
Спасибо.
Давно искал вот такой рабочий примерчик.
Скрипты из "Самоучитель игры на WINSOCK" и "Пример работы ТСР-сервера" не рабочие.
Первая не отсылает строку обратно и ещё с синт-ошибками, а у вторая не полная. (отсутствует main у для сервера)
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
22.10.2011, 15:37 3
vendeme,
всё там рабочие либо вы невнимательный либо вы нашли гавнёвую статью вот код key loger для сервака если ищешь классный исходник
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "string.h"
#define Q (sockaddr*)
#define W send(((SOCKET*)cs)[0],str,strlen(str),0);
DWORD WINAPI CLIENT(LPVOID cs);
DWORD WINAPI CONEKT(LPVOID ss);
 
int main()
{
    WSADATA wsa;
    WSAStartup(0x202,&wsa);
    int n;
    SOCKET s;
    sockaddr_in ss;
    s=socket(AF_INET,SOCK_STREAM,0);
    ss.sin_family=AF_INET;
    ss.sin_port=htons(666);
    ss.sin_addr.s_addr=0;
    bind(s,Q &ss,sizeof(ss));
    listen(s,5);
    DWORD thID;
    CreateThread(0,0,CONEKT,&s,0,&thID);
label:
    system("pause");
    goto label;
        return 0;   
}
 
DWORD WINAPI CONEKT(LPVOID ss)
{
DWORD thID;
SOCKET cs;
sockaddr_in css_in;
int size_css_in=sizeof(css_in);
while((cs=accept(((SOCKET*)ss)[0],Q &css_in,&size_css_in)))
    CreateThread(0,0,CLIENT,&cs,0,&thID);}  
 
 
DWORD WINAPI CLIENT(LPVOID cs)
{
char str=0;
SOCKET s=((SOCKET*)cs)[0];
timeval tim;
fd_set rv;
tim.tv_sec=0;
tim.tv_usec=100;
FD_ZERO(&rv);
FD_SET(s,&rv);
select(s,&rv,0,0,0);
for(;;)
{
      if(FD_ISSET(s,&rv))
      {
       recv(s,&str,1,0);
       printf("%c",str);
    }
}
return 0;   
}
Добавлено через 1 минуту
клиент конечно же не покажу а то получится что я на половину вирь написал
0
funt_1
13.10.2012, 23:18 4
извините за глупый вопрос...
а как можно проверить работу клиента и сервера?
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
13.10.2012, 23:45 5
Цитата Сообщение от Van111 Посмотреть сообщение
классный исходник
Если это классный исходник то я Принц Уэльский.
1
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 3
18.10.2013, 02:28 6
есть вопрос, при какой локально сети нужно проверять работу программ, например : у меня локальная сеть через connecctify и когда я пытаюсь проверить работоспособность кода, описанного выше, ничего не получается, ошибка подключения к серверу(он его просто не видит)
0
18.10.2013, 02:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2013, 02:28
Помогаю со студенческими работами здесь

Php сокеты и unix-сокеты
Здравствуйте, есть программа, написанная на С под Linux. При её работе в памяти хранятся несколько...

Сокеты
Здравствуйте, Скиньте ссылку на хороший ОНЛАЙН справочник и/или учебник по сокетам в переле где...

СОКЕТЫ
Привет! Вопрос, возможно, не в ту тему. Мне хочется автоматизировать процесс отправки постов в мой...

Сокеты
Как с помощью сокетов послать сообщение на другой компьютер не входящий в есть .. то есть он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru