Самый быстрый способ -
https://www.google.com/search?hl=en&new...c.1.SZtx9gFkW8A полно примеров с объяснениям, всё достаточно просто.
Код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
int main(int argc, char *argv[])
{
int sock = -1;
unsigned short port = 9999u;
struct sockaddr_in addr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
perror("socket");
return EXIT_FAILURE;
}
memset((void *) &addr, 0x00, sizeof addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, (struct sockaddr*) &addr, sizeof addr) != 0)
{
perror("bind");
return EXIT_FAILURE;
}
int bytes = 0;
char buffer[128] = {0};
while(bytes >= 0)
{
int addr_len = sizeof addr;
bytes = recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr*)&addr, &addr_len);
if(bytes == 0)
{
printf("Transfer aborted by peer\n");
}
else if(bytes < 0)
{
perror("recvfrom");
}
else
{
if(strcmp(buffer, "Tell me something") == 0)
{
const char *ack = "Hello, world!";
sendto(sock, ack, strlen(ack), 0, (struct sockaddr*)&addr, sizeof addr);
}
}
memset((void *)buffer, '\0', sizeof buffer);
}
close(sock);
return EXIT_SUCCESS;
}
Это concurrent сервер т.е. все запросы в одном цикле, подходит для UDP. Для TCP обычно делают в цикле блокирующий вызов accept, который возвращает сокет для нового клиента и для этого клиента создаётся новый поток, либо асинхронный ввод-вывод с помощью select.
По сокетам очень много в сети информации и примеров с объяснениями
https://www.google.com/search?hl=en&new...c.1.98bOenqjQYs. Я, как ни странно, это более пристально изучал по книге "Johnson M. Hart - Windows system programming", к счастью сокеты в WinAPI не сильно изуродованы виндовыми тайпдефами для каждого случая жизни и венгерской нотацией.
Сообщение отредактировал Cosmojam - Sep 12 2012, 08:57