LINUX.ORG.RU

[C] Получить данные на TCP сокет

 


0

0

Пытаюсь получить на сокет TCP пакет, но пока безуспешно.
Как сделать программу работающей: чтобы ждала пакет на порту - и при получении оный вывела на терминал? (важна реализация именно с recvmsg() или с recvfrom() )

Код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 55555

int main() {
int sock;
struct sockaddr_in addr;
struct msghdr msg = {NULL, 0, NULL, 0, NULL, 0, 0};
struct iovec iovbuf;
ssize_t recv_bytes;
char recv_string[1024];

printf("Listening port %i...\n", PORT);

// Create internet socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0) printf("couldn't create socket\n");

// Bind socket to network interface (ip address) and tcp port
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) != 0)
{ printf("error: couldn't bind socket\n"); exit(1); }

// Receive message
msg.msg_name = &addr;
msg.msg_namelen = sizeof (struct sockaddr_in);
msg.msg_iov = &iovbuf;
msg.msg_iovlen = 1;
iovbuf.iov_base = recv_string;
iovbuf.iov_len = sizeof (recv_string) - 1;

if ((recv_bytes = recvmsg (sock, &msg, 0)) < 0)
{ perror("RECVMSG"); close(sock); exit(1); }
else printf("%s\n",recv_string);

close(sock);
return 0;
}


man listen. man accept. Пошукай в гугле, есть много примеров мелких серверов.

anonymous
()

Я конечно не спец, но по-моему куда-то сюда надо вставить listen/accept или connect.

cathode
()

вот уж не знал, что на сокеты приходят TCP пакеты.

всегда думал, что это разные слои.

xydo ★★
()
Ответ на: комментарий от xydo

я не имею в виду RAW сокет, так что подразумевается само сообщение сказав TCP я подразумевал "не UDP"

anonymous
()

>чтобы ждала пакет на порту

TCP - это потоковый протокол, если нужны отдельные сообщения (пакеты) то для этого есть UDP. В TCP сначала создается неактивный сокет, на него приходит приглашение, после этого создается активный сокет (соединение), с которого можно читать поток данных (желательно создать процесс fork'ом или pthread-нить).

xTERM ★★
()
Ответ на: комментарий от xTERM

Точно. Спасибо. Я смотрел на пример с UDP - там функции listen() и accept() не использовались. На данный момент программа работает, но что меня изначально озадачило - осталось: система оставляет соединение в состоянии TIME_WAIT (что показывает netstat) на некоторое время, и это некоторое время сокет привязать к порту нелься, то есть запустив программу и приняв пакет, нужно подождать некоторое время прежде чем можно запустить ее еще раз, иначе ошибка. Но это уже другой вопрос.

Спасибо.

s0ldat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.