read函数接收socket数据实例

本节将讲解一个read函数读取数据的实例。在程序中,监听一个端口,如果有客户端连接这个端口则接受这个连接,然后用read函数读取远程主机发送的数据,输出这些数据以后结束这个程序。程序的代码如下所示。

代码17-6  read函数接收数据:/源文件/17/17.24.c

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>         /*包含头文件。*/
#define PORT 6677         /*定义一个端口号。*/
main()
{
int sockfd,newsockfd,fd;       /*定义相关的变量。*/
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
fd_set myreadfds;
char msgbuffer[256];
char msg[] ="This is the message from server.Connected./n";

if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) /*建立一个socket。*/
{
perror("socket");
exit(1);
}
else
{
printf("socket created ./n");     /*socket建立成功。*/
printf("socked id: %d /n",sockfd);
}
   bzero(&addr,sizeof(addr));      /*清空zero所在的内存。*/
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
   if(bind(sockfd,&addr,sizeof(addr))<0)    /*绑定IP端口。*/
{
perror("connect");
exit(1);
}
else
{
printf("connected./n");
printf("local port:%d/n",PORT) ;
}
   if(listen(sockfd,3)<0)        /*监听一个端口号。*/
{
perror("listen");
exit(1);
}
else
{
printf("listenning....../n"); 
}
   if((newsockfd = accept (sockfd,&addr,&addr_len))<0) /*接受一个连接。*/
{
perror("accept");
}
else             /*输出结果。*/
{
printf("cnnect from %s/n",inet_ntoa(addr.sin_addr));
if(read(newsockfd,msgbuffer,sizeof(msgbuffer))<=0)
          /*接收信息。*/
{
perror("accept");
}
else
{   
printf("message:/n%s /n",msgbuffer);   /*输出接收到的信息。*/
}
}
}


输入下面的命令,编译这个程序。

gcc 17.24.c

输入下面的命令,对这个程序添加可执行权限。

 chmod +x a.out

输入下面的命令,运行这个程序。

 ./a.out

程序的运行结果如下所示。结果表明这个程序正在监听本地计算机的6677号端口。

 socket created .
socked id: 3
connected.
local port:6677
listenning......

打开浏览器,在浏览器中输入下面的网址,然后按“Enter”键,使浏览器访问本地计算机的6677号端口。

 http://127.0.0.1:6677/

浏览器显示无法打开网页。在终端中显示了下面的代码,这些代码是浏览器向本机的6677号端口请求打开网页的数据报。

cnnect from 127.0.0.1
message:
GET / HTTP/1.1
Host: 127.0.0.1:6677
User-Agent: Mozilla/5.0 (X11; U; Linux i686;
zh-CN; rv:1.8.1.8) Gecko/20071030 Fedora/2.0.0.8-2.
fc8 Firefox/2.0.0.8
Accept: text/xml,application/xml,application/
xhtml+xml,text/html;q=0.9,text/ plain;q=0.8,image/png,*/*

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 Linux C 的 TCP 快速接收超大数据的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #define BUF_SIZE 1024 * 1024 * 10 // 10MB int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s [port]\n", argv[0]); return -1; } int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("socket() error"); return -1; } struct sockaddr_in server_addr, client_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(atoi(argv[1])); if (bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind() error"); return -1; } if (listen(sock, 5) == -1) { perror("listen() error"); return -1; } socklen_t client_addr_size = sizeof(client_addr); int conn_sock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_size); if (conn_sock == -1) { perror("accept() error"); return -1; } char *buf = (char*)malloc(BUF_SIZE); if (buf == NULL) { perror("malloc() error"); return -1; } // 关闭 Nagle 算法,禁用 TCP_NODELAY 选项 int flag = 1; setsockopt(conn_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag)); // 开启 TCP_QUICKACK 选项 flag = 1; setsockopt(conn_sock, IPPROTO_TCP, TCP_QUICKACK, (char*)&flag, sizeof(flag)); // 读取数据 int n = 0; while (n < BUF_SIZE) { int len = read(conn_sock, buf + n, BUF_SIZE - n); if (len == -1) { perror("read() error"); return -1; } else if (len == 0) { break; } n += len; } printf("Received data size: %d bytes\n", n); free(buf); close(conn_sock); close(sock); return 0; } ``` 这个示例代码实现了如下功能: 1. 创建一个 TCP 套接字,并绑定到指定的端口; 2. 监听连接请求,等待客户端连接; 3. 分配一个 10MB 大小的缓冲区,用于存储接收到的数据; 4. 关闭 Nagle 算法,禁用 TCP_NODELAY 选项,避免接收大块数据时出现延迟; 5. 开启 TCP_QUICKACK 选项,尽快发送 ACK 响应,避免接收方等待发送方的 ACK 响应; 6. 使用 read() 函数从套接字中读取数据,直到所有数据都被接收完毕,并统计接收到的数据大小。 注意:这个示例代码只是简单地演示了如何快速接收超大数据,实际应用中需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值