如何在socket编程c++中显示示例文本

how to display sample text in socket programming c++

本文关键字:显示 文本 c++ socket 编程      更新时间:2023-10-16

我得到了一个程序,该程序为给定的端口号创建一个套接字。我需要显示一个hello world文本,而它是在浏览器中访问,如果端口是8080,而访问我需要显示一个hello world文本使用c++食物:

#include <stdio.h>
#include <stdlib.h>
#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[])
{
     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 providedn");
         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, 
                 &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("Here is the message: %sn",buffer);
     n = write(newsockfd,"I got your message",18);
     if (n < 0) error("ERROR writing to socket");
     close(newsockfd);
     close(sockfd);
     return 0; 
}

当你用http://开始URL时,Web浏览器会讨论HTTP,所以你的服务器也需要讨论HTTP。

浏览器通常会发送

GET / HTTP/1.1
Host: my_website
Header1: blah blah
Header2: blah blah

请求以回车换行(LN)结束,CR LN

然后你需要创建你的回复,类似于

HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain
Hello World

空白行所有新行都有CRLN

正如其他人提到的,您可能需要做一些事情来确保您的读取不会阻塞您的服务器。

您的代码不会这样做。它会在'read(newsockfd..)直到它得到浏览器不会发送的输入。

看起来你已经复制了一些套接字服务器示例。对于相应的客户端示例,它可能没问题,但对于浏览器则不行。

如果浏览器中的页面应该显示"Hello World!"那么就写"I got your message"而不是"I got your message"。

你的例子可以工作。编译,运行

g++ socket.cpp
./a.out 8080

让你的浏览器指向它:

firefox http://localhost:8080

浏览器应该显示:I got your message

注意:这个例子来自linuxhowtos.org。向人们指出这一点也可以帮助他们推断问题。