经过一番研究后,我发现这个代码适用于服务器端。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
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
调用之后?
答案 0 :(得分:0)
似乎我需要在循环中嵌入另一个循环 - 只是 接受电话后?
是的 - 您需要继续调用write()直到所有字节都被发送完毕。请记住,write()可以写出比你要求的更少的字节,因此你需要跟踪write()的返回值,以便知道传递给下一个write()调用的参数。
示例代码忽略了write()调用的返回值,当你只编写少量字节时,你可以放弃它,但这不是你想做的事情。真实的代码。