2013-07-31 3 views
1

Привет, ребята, я читал книгу о программировании сокета и было два клиента и сервер.Программа сокетов в C не может скомпилировать

здесь код

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
void error(char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 
int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno, 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); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &client); 
    if(newsockfd < 0) 
     error("ERROR ON ACCEPT"); 
    bzero(buffer,256); 
    n = read(newsockfd,buffer,255); 
    if(n < 0) 
     error("ERROR READING FROM SOCKET"); 
     printf("HERE IS THE MESSAGE: %s\n",buffer); 
     n = write(newsockfd,"I GOT YOUR MESSAGE",18); 
     if(n < 0) 
      error("ERROR WRITING TO SOCKET"); 
     return 0; 
} 

сервера и вот код клиента

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

void error(char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 
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]); 
    } 
    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,&serv_addr,sizeof(serv_addr)) < 0) 
     error("ERROR CONECTING"); 
    printf("Please Enter the message: "); 
    bzero(buffer,256); 
    fgets(buffer,255,stdin); 
    n = write(sockfd,buffer,strlen(buffer)); 
    if(n < 0) 
    error("ERROR READING THE SOCKET"); 
    printf("%s\n",buffer); 
    return 0; 
} 

Но когда я скомпилировать его с визуальной студией или Turbo C++ или Borland C++ они дают мне ошибку Я скачал все необходимые заголовки, но проблема все еще существует.

+4

скомпилировать с gcc в Linux, а не в виде оконных сокетов –

+1

@nouney Ошибки нелогичны, ошибки в файлах заголовков, ошибки как 'missing; перед идентификатором' – mega6382

+0

Откуда вы загрузили файлы заголовков? –

ответ

3

Проблема в том, что вы читаете примеры со стандартной библиотекой сокетов «BSD». Windows использует немного другую библиотеку сокетов.

Для более общего подхода вы можете переносить стандартные программы сокетов BSD (то, что вы читаете в своей книге) на Winsock. Advice here.

Или, если вы хотите, чтобы система сокетов совместима с Windows, вы можете скачать Cygwin от http://cygwin.com/ и запустить свою программу оттуда. (Обязательно загрузите компилятор GCC и т. Д. В программу setup.exe.)

+1

Можете ли вы рассказать мне, откуда я могу скачать компилятор GCC, который я искал, но все, что я нашел, было зеркалами, но я не могу понять, что загрузить – mega6382

+1

@HaseebAhmadBasil, на данный момент это проще всего если вы загрузите http://cygwin.com/setup-x86.exe и изнутри установщика выберите следующий, следующий, пока не попадете в список программ для выбора. Разверните «devel» и выберите хотя бы «gcc-g ++» и «make». –

1

Чтобы создать это в Windows, вам нужно использовать minGW или виртуальную Linux-систему.

Смежные вопросы