客户服务器实现

经过一些研究,我发现这个代码服务器端。

#include  #include  #include  #include  #include  #include  #include  #include  #include  int main(void) { int listenfd = 0,connfd = 0; struct sockaddr_in serv_addr; char sendBuff[1025]; int numrv; listenfd = socket(AF_INET, SOCK_STREAM, 0); printf("socket retrieve success\n"); memset(&serv_addr, '0', sizeof(serv_addr)); memset(sendBuff, '0', sizeof(sendBuff)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(5000); bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)); if(listen(listenfd, 10) == -1){ printf("Failed to listen\n"); return -1; } while(1) { connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL); // accept awaiting request strcpy(sendBuff, "Message from server"); write(connfd, sendBuff, strlen(sendBuff)); close(connfd); sleep(1); } return 0; } 

事情是从服务器,我想发送一些文件到客户端,可能是256字节的块。

令我困惑的是,在上面的代码中,你可以看到在循环内部进行accept调用。 这是唯一的方法吗? 如果它应该在循环中,我在哪里放置连续读取我的文件的逻辑,并发送块? 似乎我需要在while循环中嵌入另一个循环 – 就在accept调用之后?

似乎我需要在while循环中嵌入另一个循环 – 就在接受调用之后?

是的 – 您需要继续调用write()直到所有字节都被发送完毕。 请记住,write()可能会写出比你要求的更少的字节,因此你需要跟踪write()的返回值,以了解传递给下一个write()调用的参数。

示例代码忽略了write()调用的返回值,当您只编写少量字节时,可以使用它,但不是您想要在实际代码中执行的操作。