gpt4 book ai didi

c - 套接字,从外部域获得空响应

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:24 27 4
gpt4 key购买 nike

我有这段代码,简单的套接字 C 示例代码,它适用于我编写并在本地计算机上运行的简单服务器,但是如果我尝试从谷歌网页获取 html,它会大大延迟回复并返回空缓冲区。

我的代码:

#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>
#include <errno.h>


void bye(char * mmo);

void bye(char * mm) {
printf("%s\n", mm);
exit(0);
}

int main(void) {

int tcpSocket, port;
char buffer[256],err[256], *servername,* mm;

struct hostent *server;
struct sockaddr_in serverAddr;

servername = "google.com";
tcpSocket = socket(AF_INET, SOCK_STREAM, 0);
port = 80;

server = gethostbyname(servername);
mm = "baa";

if(tcpSocket < 0) {
sprintf(err, "Can't to initialize TCP socket communication(%s).", strerror(errno));
bye(err);
}

if(NULL == server) {
bye("Server not found");
}

memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
memcpy(&serverAddr.sin_addr.s_addr,
server->h_addr,
server->h_length);
serverAddr.sin_port = htons(port);

if(connect(tcpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {
sprintf(err, "failed internet connection. %s", strerror(errno));
bye(err);
}
if(write(tcpSocket, mm, strlen(mm)) < 0) {
sprintf(err, "Can't send.(%s)\n", strerror(errno));
bye(err);
}

memset(buffer, 0, sizeof(buffer));

while(read(tcpSocket, buffer, 255) < 0) {
printf("%s", buffer);
}

close(tcpSocket);
printf("done!\n");

return 0;
}

提前致谢。:)

最佳答案

引用读取结果的代码:

while(read(tcpSocket, buffer, 255) < 0) {
printf("%s", buffer);
}

此类代码仅在 read() 返回值小于 0 的情况下打印出缓冲区的内容,而 read 在出现错误时会执行此操作。

您可能想像这样修改您的代码:

{
size_t sizeReadTotal = 0;
size_t sizeToRead = 255;
ssize_t ssizeRead = 0;
while (sizeToRead && (ssizeRead = read(tcpSocket, buffer + sizeReadTotal, sizeToRead))) {
if (0 > sizeRead) {
if (EAGAIN == errno || EWOULDBLOCK == errno)
continue;
else
break;
}

sizeToRead -= ssizeRead;
sizeReadTotal += ssizeRead;
}

if (0 > ssizeRead)
printf("read() failed after having read %dbytes: %s\n", sizeReadTotal, strerror(errno));

printf("Data read: '%s'\n", buffer);
}

此外,您还应该将 '\n' 发送到服务器(如 selbie 所述),因此更改:

mm = "baa";

进入

mm = "baa\n";

关于c - 套接字,从外部域获得空响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com