Передача большого буфера через сокет - C (СИ)
Формулировка задачи:
Ниже приведены клиент и сервер(позаимствовал из соседней темы).
Все работает, но при передаче буфера в 500000 байт сервер принимает каждый раз разное число байт.
иногда все, иногда - 393216.491520, причем read завершается без ошибок, отправляются все байты.
Как быть? Куда копать?
PS:
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main(int argc,char ** argv ) { int sockfd; int len,len2=0; struct sockaddr_in address; int result; char lenbuf[256], *buf; sockfd = socket (AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr= inet_addr("127.0.0.1"); address.sin_port = htons(9734); len = sizeof(address); result = connect(sockfd, (struct sockaddr *) &address, len); if(result==-1) { printf("don't connect\n"); perror("ppos: client"); exit(1); } char *d; d = malloc(500000); FILE *fd; fd = fopen("/tmp/data", "r"); int n = fread(d,1,500000,fd); write(sockfd, d, n); read(sockfd, d, 10); printf("%d\n",n); close(sockfd); return 0; }
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> int main() { int err=-1; int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; server_sockfd = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(9734); server_len = sizeof(server_address); err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len)); if(err!=0) printf("bind error!\n"); else printf("bind is ok\n"); err=-1; err=(listen(server_sockfd, 5)); if(err!=0) printf("listen error!\n"); else printf("listen is ok\n"); char *d = malloc(500000); while(1) { printf("server waiting\n"); client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len); int n,s=0; n = 0; while((n = read(client_sockfd, d, 500000)) > 0){ s += n; write(client_sockfd, d, 10); } if(n < 0){ printf("%s",strerror(errno)); } printf(" %d\n",s); memset(d,0,500000); close(client_sockfd); } }
Решение задачи: «Передача большого буфера через сокет»
textual
Листинг программы
#include <sys/poll.h> ... struct pollfd p; p.fd = sockd; p.events = POLLIN; if (poll(&p, 1, 1) < 1) break;
Объяснение кода листинга программы
- Включаем заголовочный файл <sys/poll.h>.
- Создаем структуру pollfd p.
- Присваиваем полю fd значение sockd.
- Присваиваем полю events значение POLLIN.
- Вызываем функцию poll с аргументами p, 1 и 1.
- Если результат меньше 1, то выходим из цикла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д