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

Клиентское и серверное приложение с использованием сокетов на C++

Октябрь 16, 2013

1377957561_pocket

И так, для того, чтобы написать любое приложение, которое работает с сокетами в Windows, необходимо включить в ваш проект файл winsock2.h и библиотеку WS2_32.lib В Microsoft Visual C++ Express edition. Это можно сделать так: Проект -> Свойства проекта -> Свойства конфигурации -> Компоновщик -> Ввод и в поле “Дополнительные зависимости” нужно вписать имя библиотеки.

И так, код сервера:

#include <winsock2.h>
#include <stdio.h>
 
int main(void)
{
    WORD sockVer;
    WSADATA wsaData;
    int retVal;
 
    sockVer = MAKEWORD(2,2);
 
    WSAStartup(sockVer, &amp;wsaData);
 
    //Создаем сокет
    SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(servSock == INVALID_SOCKET)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
	SOCKADDR_IN sin;
    sin.sin_family = PF_INET;
    sin.sin_port = htons(1111);
    sin.sin_addr.s_addr = INADDR_ANY;
 
    retVal = bind(servSock, (LPSOCKADDR)&amp;sin, sizeof(sin));
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to bind\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    //Пытаемся начать слушать сокет
    retVal = listen(servSock, 10);
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to listen\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
    //Ждем клиента
    SOCKET clientSock;
 
    clientSock = accept(servSock, NULL, NULL);
 
    if(clientSock == INVALID_SOCKET)
    {
        printf("Unable to accept\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    char szReq[8]; 
    retVal = recv(clientSock, szReq, 8, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        return SOCKET_ERROR;
    }
 
    printf("Got the request from client\n%s\n",szReq);
 
    char *szResp = "Response";
 
    printf("Sending response from server\n");
    retVal = send(clientSock, szResp, strlen(szResp), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        return SOCKET_ERROR;
    }
 
    //Закрываем сокет
    closesocket(clientSock);
    closesocket(servSock);
 
    WSACleanup();
    return 0;
}

Код клиента:

#include <stdio.h>
#include <winsock2.h>
 
int main()
{
    WORD ver = MAKEWORD(2,2);
    WSADATA wsaData;
    int retVal=0;
 
    WSAStartup(ver,(LPWSADATA)&amp;wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("localhost");
 
    if(!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        return 1;
    }
 
    //Создаем сокет
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return 1;
    }
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr = *((LPIN_ADDR)*hostEnt-&gt;h_addr_list);
    serverInfo.sin_port = htons(1111);
 
    retVal=connect(clientSock,(LPSOCKADDR)&amp;serverInfo, sizeof(serverInfo));
    if(retVal==SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        return 1;
    }
 
    printf("Connection made sucessfully\n");
 
    char *pBuf = "Request";
 
    printf("Sending request from client\n");
    retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        WSACleanup();
        return 1;
    }
 
    char szResponse[9];
    retVal = recv(clientSock, szResponse, 9, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        WSACleanup();
        return 1;
    }
 
    printf("Got the response from server\n%s\n",szResponse);
 
    closesocket(clientSock);
    WSACleanup();
 
    return 0;
}

Более подробное описание методов можно найти здесь

Понравилась статья? Жми:

Поделиться в соц. сетях



Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Поддержите проект

Хит продаж:

Случайный анекдот

Моя вторая книга

Что это???

Программирование для Android:

Мы вконтакте

Помощь сайту

Понравился сайт? Он сильно нуждается в раскрутке.

Чтобы помочь в раскрутке - опубликуйте ссылку на сайт (или любую его страницу) на любом другом сайте в интернете. Тогда сайт станет чуточку популярнее.

Или просто нажмите на кнопки социальных сетей которые стоят в конце каждой статьи

Вместе мы сможем сделать программирование более популярным и более понятным для всех!

Заранее спасибо!
Артём Кашеваров.