LINUX.ORG.RU

Как создать сокет?

 ,


0

2

Хочу сделать простую программу для обмена сообщениями между компьютерами на языке Си (!). Достаточно просто консоли. Хотел бы под Linux. Погуглил на эту тему. Примеры либо не работают, либо излагается для людей уже имеющих опыт разработки в данной сфере. Я - зелёный новичок :) Прошу вашей помощи.


Почитай, как ни странно, man socket. Ну и всё, что будет в графе SEE ALSO.

Bfgeshka ★★★★★ ()

Если совсем не хочешь разбираться с ними, попробуй использовать строннее приложение - socat.

ns_ramesses ()

А оно тебе надо?

Запусти netcat. Один человек говорит:

nc -l 8089

Второй (localhost — пример, чтобы можно было проверить на одной машине):

nc localhost 8089

И печатает что угодно. После enter-а первый все увидит. На C? На C. Сообщение передается? Передается. Квест комплит!

anonymous ()

Хочу сделать простую программу для обмена сообщениями между компьютерами на языке Си (!).

Какой молодец, сам нашел и выделил проблему. Тут действительно ошибка, должен быть Python.

t184256 ★★★★★ ()

как ни странно, системным вызовом socket()

Harald ★★★★★ ()

На, играйся.

server

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

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{    
     long long int mycount=0;
     int sockfd, newsockfd, portno;
     socklen_t clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
  
     revert://ждём нового сообщения

     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("Получено сообщение: %s[%lld]>\n",buffer,mycount++);
     n = write(newsockfd,"Сообщение-доставленно\n",50);
 

     

     goto revert;//как только получили сообщение вернёмся и ждём нового.

     if (n < 0) error("ERROR writing to socket");
     close(newsockfd);
     close(sockfd);
     return 0; 
}

client

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

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);
    close(sockfd);
    return 0;
}

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

Эээ, зачем тебе там bzero делать? Почему б просто не выводить количество символов равное записанному в буфер? http://stackoverflow.com/a/2239571

и вообще, bzero deprecated. Используй memset вместо него

SZT ★★★★ ()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

Похоже что он просто бздун, у них насколько я знаю это так и делают.

itn ★★ ()

Читай Unix Network Programming Стивенса.

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