Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将消息发送到套接字C_C_Sockets - Fatal编程技术网

将消息发送到套接字C

将消息发送到套接字C,c,sockets,C,Sockets,我对socket编程一无所知。现在我只是在尝试随机找到的东西。因此,我有一个程序(下面的代码),它使用csapp.h和csapp.c,特别是open\u clientfd(主机名、端口)函数和RIO IO来打印输入的内容 嗯,当我试着运行这个程序时。/prog www.google.com 80(我甚至不确定主机名和端口),它正在打印奇怪的东西,然后停止 预期产出: Enter message:abc Echo:abc 实际产量: Enter message:abc Echo:HTTP/1.

我对socket编程一无所知。现在我只是在尝试随机找到的东西。因此,我有一个程序(下面的代码),它使用
csapp.h
csapp.c
,特别是
open\u clientfd(主机名、端口)
函数和RIO IO来打印输入的内容

嗯,当我试着运行这个程序时。/prog www.google.com 80(我甚至不确定主机名和端口),它正在打印奇怪的东西,然后停止

预期产出:

Enter message:abc
Echo:abc
实际产量:

Enter message:abc
Echo:HTTP/1.0 400 Bad Request
下面是我的代码:

int main(int argc, char **argv)
{
   int clientfd, port;
   char *host, buf[MAXLINE];
   rio_t rio;
   host = argv[1];  port = atoi(argv[2]);

   clientfd = Open_clientfd(host, port);

   Rio_readinitb(&rio, clientfd);
   printf("Enter message:"); fflush(stdout);

   while (Fgets(buf, MAXLINE, stdin) != NULL) {
      Rio_writen(clientfd, buf, strlen(buf));
      Rio_readlineb(&rio, buf, MAXLINE);

      printf("Echo:");

      Fputs(buf, stdout);
      printf("Enter message:");

      fflush(stdout);
   }

   Close(clientfd);
   exit(0);
}
我还有一个问题。如何将这样的内容发送到套接字

GET /index.html HTTP/1.1\r\n
Host: www.google.com\r\n
\r\n

看起来您正在这样做。正确:

telnet www.google.com 80
Trying 173.194.123.19...
Connected to www.google.com.
Escape character is '^]'.
message abc
HTTP/1.0 400 Bad Request

看起来您正在这样做。正确:

telnet www.google.com 80
Trying 173.194.123.19...
Connected to www.google.com.
Escape character is '^]'.
message abc
HTTP/1.0 400 Bad Request

如果我正确理解了您的代码和命令的意图,那么您的代码就可以了……但对于google.com服务器就不行了。您知道,google.com服务器是一个HTTP服务器,因此会响应HTTP请求,就像您在第二个问题中提出的请求一样。发送该请求将产生响应-index.html内容和响应头

比如说,如果你用你正在使用的库编写一个简单的服务器应用程序,无论它发送什么,都会回显到客户端,那么你就会看到你想要的输出

下面是简单服务器的完整代码,它分叉于accept并响应您发送给它的内容(由Beej的《网络编程指南》提供,由我稍加修改)

然后使用:

send(sock_fd, index_get_request, strlen(index_get_request), 0);

如果我正确理解了您的代码和命令的意图,那么您的代码就可以了……但对于google.com服务器就不行了。您知道,google.com服务器是一个HTTP服务器,因此会响应HTTP请求,就像您在第二个问题中提出的请求一样。发送该请求将产生响应-index.html内容和响应头

比如说,如果你用你正在使用的库编写一个简单的服务器应用程序,无论它发送什么,都会回显到客户端,那么你就会看到你想要的输出

下面是简单服务器的完整代码,它分叉于accept并响应您发送给它的内容(由Beej的《网络编程指南》提供,由我稍加修改)

然后使用:

send(sock_fd, index_get_request, strlen(index_get_request), 0);
该协议在实践中相当复杂(核心协议很简单,但有很多特殊情况)。我建议使用一些HTTP客户端库(例如…)或HTTP服务器库(例如)

如果您不想使用HTTP或一些定义良好的协议,但例如一些更简单的协议(您可能会找到许多其他协议的服务器和客户端库,如SMTP、JSON-RPC等…),您必须明确地设计和定义这些协议,您需要编写服务器端和客户端的代码(并在您的计算机上进行测试),两个不同的一个,或者如果使用
localhost
即IPV4中的127.0.0.1,则相同)

顺便说一句,插座不在标准C99(或C11)中。您需要由您的操作系统提供它们。POSIX具有受API启发的套接字

注意,套接字只是一个字节流。发送端和接收端都需要缓冲区。无法保证发射器侧的单个(或
写入
)对应于相同数据大小的单个(或
读取
)。通常情况下,您需要创建和缓冲(对于部分应用程序“消息”)。

该协议在实践中相当复杂(核心协议很简单,但有很多特殊情况)。我建议使用一些HTTP客户端库(例如…)或HTTP服务器库(例如)

如果您不想使用HTTP或一些定义良好的协议,但例如一些更简单的协议(您可能会找到许多其他协议的服务器和客户端库,如SMTP、JSON-RPC等…),您必须明确地设计和定义这些协议,您需要编写服务器端和客户端的代码(并在您的计算机上进行测试),两个不同的一个,或者如果使用
localhost
即IPV4中的127.0.0.1,则相同)

顺便说一句,插座不在标准C99(或C11)中。您需要由您的操作系统提供它们。POSIX具有受API启发的套接字


注意,套接字只是一个字节流。发送端和接收端都需要缓冲区。无法保证发射器侧的单个(或
写入
)对应于相同数据大小的单个(或
读取
)。通常情况下,您需要添加和缓冲(对于部分应用程序“消息”)。

结果看起来是正确的,只是看起来您没有对端口使用正确的HTTP

jason@io ~ $ nc -v www.google.com 80
nc: sea09s15-in-f20.1e100.net (173.194.33.84) 80 [http] open
nc: using stream socket
message:abc
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1419
Date: Wed, 05 Aug 2015 23:00:52 GMT
Server: GFE/2.0

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 400 (Bad Request)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/errors/logo_sm_2.png) no-repeat}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/errors/logo_sm_2_hr.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:55px;width:150px}
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>400.</b> <ins>That’s an error.</ins>
  <p>Your client has issued a malformed or illegal request.  <ins>That’s all we know.</ins>
jason@io~$nc-v www.google.com 80
nc:sea09s15-in-f20.1e100.net(173.194.33.84)80[http]打开
nc:使用流套接字
信息:美国广播公司
HTTP/1.0 400错误请求
内容类型:text/html;字符集=UTF-8
内容长度:1419
日期:2015年8月5日星期三23:00:52 GMT
服务器:GFE/2.0
错误400(错误请求)!!1.
*{margin:0;padding:0}html,代码{font:15px/22px arial,sans serif}html{background:fff;color:222;padding:15px}body{margin:7%自动0;最大宽度:390px;最小高度:180px;padding:30px 0 15px}>body{background background:url(//www.google.com/images/errors/robot.png)100%5px不重复;padding右侧:205px}p{margin{颜色:{777;文本装饰:无}一个img{border:0}@media屏幕和(最大宽度:772px){body{background:none;边距顶部:0;最大宽度:none;填充右侧:0}}}logo{background:url(//www.google.com/images/errors/logo\u sm_2.png)无重复}@media纯媒体屏幕和(最小分辨率:192dpi){logo{background:url(//www.google.com/images/errors/logo\u.png)不重复0%0%/100%100%;-moz边框图像:url(//www.google.com/images/errors/logo_sm_2_hr.png)0}@media-only屏幕和(-webkit最小设备像素比:2){logo{背景:url(//www.google.com/images/errors/logo_sm_2_hr.png)不重复;-webkit背景大小:100%100}logo{显示:内联块;高度:55px;宽度:150px}
那是个错误。
你的客户发出了一个格式错误或非法的请求。我们只知道这些。
如果您想了解更多关于HTTP文本的信息